deque.popleft()vs list.pop(0),性能分析

时间:2017-06-01 17:41:10

标签: performance python-2.7 list deque pop

根据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每次循环

是什么原因?

1 个答案:

答案 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()秒内运行,这在弹出最后一个元素时是非常好的,正如预期的那样。