Python deque:与列表的区别?

时间:2014-03-12 01:17:47

标签: python

我正在阅读Python文档:我不明白双端队列如何与列表不同。来自文档:

  

返回从左到右初始化的新deque对象(使用append())   来自iterable的数据。如果未指定iterable,则使用新的deque   是空的。

     

Deques是堆栈和队列的概括(名称是   发音为“deck”,是“双端队列”的缩写。双端   支持线程安全,内存高效的附加和弹出   deque的一侧具有大致相同的O(1)性能   任何方向。

     

虽然列表对象支持类似的操作,但它们已经过优化   快速固定长度操作并导致O(n)内存移动成本   pop(0)和insert(0,v)操作,它们改变了大小和   基础数据表示的位置。

如果deque基本上是一个列表,但效率更高,为什么会使用列表代替双端队列?

3 个答案:

答案 0 :(得分:10)

deque更有效用于从末端推送和弹出。请继续阅读,并在您将找到的方法列表下方:

  

索引访问在两端都是O(1),但在中间减慢到O(n)。对于快速随机访问,请改用列表。

在列表的开头添加或删除是O(n),但从中间获取元素是O(1)。对于双端队列,情况正好相反。

所以一般来说,当你不关心中间的东西时,你只需要一个双端队列;你想以某种顺序喂它,然后在其他地方按顺序取回它们。

答案 1 :(得分:3)

Deque是一个双向链表,而List只是一个数组。

随机访问索引i处的对象,Deque为O(n),List为O(1)。

开头的快速插入和删除是Deque的最大优势。 快速随机读取是List的优势。

如果插入和删除在容器中间随机发生,Deque将必须找到节点(O(n),然后插入新节点(O(1)),而{{1}必须移动一些节点(O(n))。

他们都有自己的用例。

答案 2 :(得分:0)

应该对列表进行迭代和/或随机访问。 典型用法:存储同类数据项的集合。

队列设计为在末尾/开始时进行操作。 典型用法:存储具有优先级信息的数据,以方便进行广泛/深度优先的搜索。