根据this question,我检查了笔记本电脑的性能。
令人惊讶的是,我发现来自pop(0)
的{{1}}比来自list
结构的popleft()
更快:
deque
给出:
10000循环,最好是3: 66 usec 每个循环
,同时:
python -m timeit 'l = range(10000)' 'l.pop(0)'
给出:
10000循环,最好的3: 123 usec 每个循环
此外,我检查了jupyter的表现,找到了相同的结果:
python -m timeit 'import collections' 'l = collections.deque(range(10000))' 'l.popleft()'
10000次循环,最佳3次:64.7μs每次循环
%timeit l = range(10000); l.pop(0)
10000次循环,最佳3次:122μs每次循环
是什么原因?
答案 0 :(得分:0)
问题在于,您的 a Value b Step
1 4 0.232 0.2 1
2 5 0.261 0.094 1
3 4 0.932 0.044 1
4 5 0.875 0.021 1
5 4 NA 0.01 1
6 5 NA 0.2 1
7 4 NA 0.094 1
8 5 NA 0.044 1
9 4 NA 0.021 1
10 5 NA 0.01 1
11 4 0.197 0.2 2
12 5 0.197 0.094 2
13 4 0.640 0.044 2
14 5 0.643 0.021 2
15 4 0.958 0.01 2
16 5 1.032 0.2 2
17 4 0.943 0.094 2
18 5 1.119 0.044 2
19 4 0.943 0.021 2
20 5 1.119 0.01 2
21 4 0.268 0.2 3
22 5 0.262 0.094 3
23 4 NA 0.044 3
24 5 NA 0.021 3
25 4 NA 0.01 3
26 5 NA 0.2 3
27 4 NA 0.094 3
28 5 NA 0.044 3
29 4 NA 0.021 3
30 5 NA 0.01 3
调用也会延迟deque / list 创建,并且由于链接,创建timeit
显然要慢得多。
在命令行中,您可以使用deque
选项将设置传递给timeit
,如下所示:
-s
此外,由于安装程序只运行一次,因此我在修改后会出现一个弹出错误(空列表),因为我没有更改默认的迭代次数,所以我创建了一个大的双端队列来弥补它,并得到了< / p>
python -m timeit -s"import collections, time; l = collections.deque(range(10000000))" "l.popleft()"
另一方面,10000000 loops, best of 3: 0.0758 usec per loop
速度较慢:
list
我还在一个脚本中编写了工作台(更方便),设置(以避免设置时钟)和100000大小列表上的99999次迭代:
python -m timeit -s "l = list(range(10000000))" "l.pop(0)"
100 loops, best of 3: 9.72 msec per loop
毫不奇怪:import timeit
print(timeit.timeit(stmt='l.pop(0)',setup='l = list(range(100000))',number=99999))
print(timeit.timeit(setup='import collections; l = collections.deque(range(100000))', stmt='l.popleft()', number=99999))
获胜:
deque
请注意,列表的2.442976927292288 for pop in list
0.007311641921253109 for pop in deque
在l.pop()
秒内运行,这在弹出最后一个元素时是非常好的,正如预期的那样。