list 与 deque 的性能对比如下,deque 比 list 快了将近一倍。
In [1]: from collections import deque
In [2]: s = list(range(1000))
In [3]: d = deque(s)
In [4]: s_append, s_pop = s.append, s.pop
In [5]: d_append, d_pop = d.append, d.pop
In [6]: %timeit s_pop(); s_append(None)
10000000 loops, best of 3: 115 ns per loop
In [7]: %timeit d_pop(); d_append(None)
10000000 loops, best of 3: 70.5 ns per loop
- deque 的 appendleft() 和 popleft() 的时间复杂度为 O(1)
- list 的 insert(0, value) 和 pop() 的时间复杂度为 O(n)
列表追加性能好坏不定,因为它使用了realloc()。
因此,往往在简单代码中列表的性能不算太差(因为 realloc 内存分配机制不需要移动数据),而在实际应用代码中计时非常慢(因为 realloc 机制会移动所有数据)。
相比之下,deque的附加性能是一致的,因为它从不重新分配内存和移动数据。