Python deque:与列表的区别?

16 投票
4 回答
8718 浏览
提问于 2025-04-17 21:52

我在看Python的文档,想弄明白deque和列表有什么不同。文档里是这么说的:

返回一个新的deque对象,它是从左到右初始化的(使用append()方法),数据来自可迭代对象。如果没有指定可迭代对象,新的deque就是空的。

deque是栈和队列的一个扩展(这个名字读作“deck”,是“双端队列”的缩写)。deque支持线程安全、内存高效的在两端添加和删除元素,性能大约都是O(1),无论是从哪一边操作。

虽然列表对象也支持类似的操作,但它们是为了快速处理固定长度的操作而优化的,对于pop(0)和insert(0, v)这些会改变数据大小和位置的操作,内存移动的成本是O(n)。

如果deque基本上就是一个更高效的列表,那为什么还会有人用列表而不是deque呢?

4 个回答

1

这段内容对理解上面的回答会很有帮助。根据文档的说明:

我们也可以把列表当作队列来用,意思是先放进去的元素会先被取出来(这叫“先进先出”)。不过,列表在这方面并不是很高效。虽然从列表的末尾添加和删除元素很快,但从列表的开头插入或删除元素就比较慢了(因为这样会导致其他所有元素都要往后移动一位

想了解更多关于时间复杂度的分析,可以查看这个链接: https://wiki.python.org/moin/TimeComplexity

2

列表是用来遍历或者随机访问的。
通常的用法是存储一组相同类型的数据。

队列是为了在开始或结束的位置进行操作而设计的。
通常的用法是存储带有优先级的信息,帮助进行广度优先或深度优先的搜索。

10

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

Deque 中,想要随机访问第 i 个元素的时间复杂度是 O(n),而在 List 中则是 O(1)。

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

如果在容器中随机地在中间进行插入和删除,Deque 需要先找到那个节点(O(n)),然后再插入一个新节点(O(1)),而 List 则需要移动一些节点(O(n))。

它们各自都有适合的使用场景。

21

双端队列(deque)在从两端添加或删除元素时效率更高。接下来,你会看到一些方法的列表:

从两端访问元素的速度是O(1),但是如果要从中间访问,就会变得很慢,变成O(n)。如果你需要快速随机访问,建议使用列表。

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

所以一般来说,当你不在乎中间的内容时,使用双端队列比较合适;你可以按某种顺序添加元素,然后再按这个顺序取出来。

撰写回答