测试之路

#Python#列表之 list 与 deque

2018-05-06  本文已影响43人  我叫GTD

提到列表,相信第一印象肯定会是list,而list确实也能解决大部分的需要,但碰到列表内的数据量相当大的时候,性能问题就显得尤为重要;再或者列表被恶意注入一个无穷大的数据量时,就可能会暴露出安全问题来。较好的替代方法是:collections.deque。获得性能或安全的同时,牺牲的是数据大小。
下面是两者都存在的功能:

# 创建
a_list = [1, 2, 3, 4]

from collections import deque
b_deque = deque([1, 2, 3, 4])

# 在列表末尾添加新的对象
a_list.append(5)
b_deque.append(5)

# 统计某个元素在列表中出现的次数
a_list.count(2)
b_deque.count(2)

# 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
a_list.extend([6, 7, 8])
b_deque.extend([6, 7, 8])

# 从列表中找出某个值第一个匹配项的索引位置
a_list.index(5)
b_deque.index(5)

# 将对象插入列表
a_list.insert(3, 'x')
b_deque.insert(3, 'x')

# 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
a_list.pop()
b_deque.pop()

# 移除列表中某个值的第一个匹配项
a_list.remove('x')
b_deque.remove('x')

# 反向列表中元素
a_list.reverse()
b_deque.reverse()

# 清空列表
a_list.clear()
b_deque.clear()

# 复制列表
a_list.copy()
b_deque.copy()

由此可见,在list中的所有功能几乎可以以同样的方式在deque里实现。但deque中不能使用sort方法来排序,可以以sorted(b_deque)来实现。
下面是deque中特有的方法:

from collections import deque
b_deque = deque([4, 7, 1, 5, 8])

# 从左侧移除列表中的一个元素,并且返回该元素的值
b_deque.leftpop()

# ---用list实现也不是不可,只不过有点麻烦~~~
def leftpop(lists):
  x = lists[0]
  del lists[0]
  return x
leftpop(a_list)

# 在列表首端一次性追加另一个序列中的多个值
b_deque.extendleft(['x', 'y'])

# 限制deque的长度
c_deque = deque([1, 2, 3, 4], maxlen=4)
c_deque.append(5) # 此时会在末尾加入5,同时删除最前面的1。

对于deque来说从队列两端添加或弹出元素的复杂度都是O(1)。而从列表的头部插入或移除元素时,列表的复杂度为O(N)。

上一篇下一篇

猜你喜欢

热点阅读