- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
deque.popleft()
和 list.pop(0)
似乎返回相同的结果。它们之间有什么性能差异吗?为什么?
最佳答案
deque.popleft() 比 list.pop(0) 快,因为 deque 已被优化为大约在 O(1) 内执行 popleft(),而 list.pop(0) 需要 O(n)(请参阅deque objects ).
deque 的 _collectionsmodule.c 和 list 的 listobject.c 中的注释和代码提供了实现见解以解释性能差异。也就是说,双端队列对象“由双向链表组成”,它有效地优化了两端的追加和弹出,而列表对象甚至不是单链表而是 C 数组(指向元素的指针(参见 Python 2.7 listobject.h#l22 和Python 3.5 listobject.h#l23 ),这使得它们有利于快速随机访问元素,但在移除第一个元素后需要 O(n) 时间来重新定位所有元素。
对于 Python 2.7 和 3.5,这些源代码文件的 URL 是:
https://hg.python.org/cpython/file/2.7/Modules/_collectionsmodule.c
https://hg.python.org/cpython/file/3.5/Modules/_collectionsmodule.c
使用 %timeit,当双端队列和列表都具有相同的 52 个元素时,deque.popleft() 和 list.pop(0) 之间的性能差异大约是 4 倍,并且增长到超过 1000 倍时它们的长度是 10**8。测试结果如下。
import string
from collections import deque
%timeit d = deque(string.letters); d.popleft()
1000000 loops, best of 3: 1.46 µs per loop
%timeit d = deque(string.letters)
1000000 loops, best of 3: 1.4 µs per loop
%timeit l = list(string.letters); l.pop(0)
1000000 loops, best of 3: 1.47 µs per loop
%timeit l = list(string.letters);
1000000 loops, best of 3: 1.22 µs per loop
d = deque(range(100000000))
%timeit d.popleft()
10000000 loops, best of 3: 90.5 ns per loop
l = range(100000000)
%timeit l.pop(0)
10 loops, best of 3: 93.4 ms per loop
关于python - deque.popleft() 和 list.pop(0)。有性能差异吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32543608/
这个问题在这里已经有了答案: How to check if a deque is empty (3 个答案) 关闭 4 年前。 我一直在寻找迭代双端队列的最佳方法,同时使用 popleft 来使用
我正在尝试存储一个命令列表,以在 Python 中使用双端队列发送串行电缆。 我的函数“send_command”接受 3 个值;命令,一个整数。暂停和 bool 等待。其定义如下。 def send
我正在为这个循环寻找更优雅的解决方案。我的双端队列是动态创建的,长度可以变化。在下面的示例中,列表只有两个项目,最多可以有 3 个项目。在我的应用程序中,列表最多可以包含 30 个项目。因此,我想避免
我在学习 Python 中的数据结构时一直在学习队列,并想询问有关其使用的问题。 我想有两种方法从队列中追加/弹出。第一种方法是使用 deque.append()和 deque.popleft() .
根据 this question ,我检查了笔记本电脑的性能。 令人惊讶的是,我发现 pop(0)来自list比 popleft() 快来自deque结构: python -m timeit 'l =
deque.popleft() 和 list.pop(0) 似乎返回相同的结果。它们之间有什么性能差异吗?为什么? 最佳答案 deque.popleft() 比 list.pop(0) 快,因为 de
我是一名优秀的程序员,十分优秀!