deque.popleft()
并且list.pop(0)
似乎返回相同的结果。它们之间有什么性能差异,为什么?
deque.popleft()比list.pop(0)更快,这是因为deque已被优化以在O(1)中执行popleft(),而list.pop(0)需要O(n)(请参阅deque对象) 。
_collectionsmodule.c中用于deque的注释和代码以及listobject.c中用于list的注释和代码提供了实现见解,以解释性能差异。即,双端队列对象“由双向链接列表组成”,可以有效地优化两端的追加和弹出,而列表对象甚至不是单链接列表,而是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/2.7/Objects/listobject.c
https://hg.python.org/cpython/file/3.5/Modules/_collectionsmodule.c
https://hg.python.org/cpython/file/3.5/Objects/listobject.c
使用%timeit,当双端队列和列表具有相同的52个元素时,deque.popleft()和list.pop(0)之间的性能差异约为4倍,而当长度为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
问题内容: 我曾经听过一位老师丢弃它,此后一直困扰着我。假设我们要检查整数是否大于或等于0。有两种检查方法: 和 据这个老师说会快一些。在这种情况下,它是Java,但据他说,这也适用于C,c ++和其他语言。这句话有什么道理吗? 问题答案: 在现实世界中没有任何区别。 让我们看一下各种编译器为各种目标生成的代码。 我假设一个有符号的int操作(这似乎是OP的意图) 通过调查,我仅限于C和我手边的编
根据这位老师的说法,会比稍微快一点。在本例中,它是Java,但据他说,这也适用于C、C++和其他语言。这种说法有道理吗?
这不是重复我的问题,我查了一下,更多的是关于内部匿名类。 我对Lambda表达式很好奇,并测试了以下内容: 如果给定一个数组中有1000个索引,那么对于一个包含1000个索引的循环,删除哪个条目会更快 最初的结果并不令人惊讶,因为我不知道自己会想出什么: 但后来,我决定将常量改为一百万,结果如下: 为了让阅读更简单,以下是结果: 我有以下问题: > 这背后的魔力是什么?当要使用的索引是*100时,
问题内容: 我正在计算稀疏自动编码器的算法。我已经使用和在python中实现了它。代码几乎相同,但是性能却大不相同。matlab完成任务所需的时间为0.252454秒,而numpy为0.973672151566,几乎是原来的四倍。在最小化问题中,我将在以后多次调用此代码,因此这种差异会导致实现之间的延迟几分钟。这是正常行为吗?如何提高numpy的性能? numpy实现: Sparse.rho是调整
是的,这是一个老话题,但我还是有些困惑。 在爪哇,人们说: LinkedList的插入速度比ArrayList快。这里插入是什么意思?如果这意味着向后移动一些元素,然后将元素放在中间的空点,那么ArrayList应该比LinkedList慢。如果插入只意味着添加(对象)操作,这怎么会慢呢?
Spark shell:它基本上打开了scala spark sql:它似乎直接连接到hive元存储,我们可以用类似于hive的方式编写查询。并查询配置单元中的现有数据 我想知道这两者的区别。。在spark sql中处理任何查询是否与在spark shell中相同?我的意思是,我们可以在spark sql中利用spark的性能优势吗? Spark 1.5.2在这里。