2017-06-01 18 views
1

this questionによれば、私は自分のラップトップでパフォーマンスをチェックしました。 、3の最高deque.popleft()vs list.pop(0)、パフォーマンス分析

10000ループ:ループあたり66マイクロ秒

python -m timeit 'l = range(10000)' 'l.pop(0)' 

が与える:

驚くべきことに、私はlistからpop(0)deque stuctureからpopleft()よりも高速であることがわかりました

while:

python -m timeit 'import collections' 'l = collections.deque(range(10000))' 'l.popleft()' 

ができます:

10000ループを、3最高:

:ループあたり 123マイクロ秒

はまた、私は同じ結果を見つけることjupyterのパフォーマンスをチェックします

%timeit l = range(10000); l.pop(0) 

の10000ループ、3の最高:64.7マイクロ秒のループごと

from collections import deque 
%timeit l = deque(range(10000)); l.popleft() 

10000ループ、3の最高:理由は何122マイクロ秒のループごと

答えて

0

問題は、あなたのtimeitもコール回両端キュー/リスト作成、および作成dequeが原因チェーンの明らかに非常に遅いということです。コマンドラインで

、あなたはこのような-sオプションを使用timeitセットアップを渡すことができます。また

python -m timeit -s"import collections, time; l = collections.deque(range(10000000))" "l.popleft()" 

を、セットアップは一度だけ実行しているので、あなたはポップ・エラー(空のリスト)を取得whule後、以来、私は繰り返しのデフォルト数を変更していないので、私はそれを補うために、大きな両端キューを作成し、それが遅くなりますlistで一方

10000000 loops, best of 3: 0.0758 usec per loop 

を得た:

私もセットアップして、スクリプト(より便利な)でベンチをコード化している
python -m timeit -s "l = list(range(10000000))" "l.pop(0)" 
100 loops, best of 3: 9.72 msec per loop 

(セットアップクロックを供給しない)と100000サイズのリストに99999回の反復:

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()は最後の要素をポップするときEXPEとして、非常に良いですこれは、0.011536903686244897秒で実行することに注意してくださいcted。

+0

正しい解析では、n回ではなく1回だけ作成することを考慮する必要がありますか? – Ale

+0

@Ale:はい、一度作成してください。あなたが創造+ポップを測定しない限り。コマンドラインのアプローチを示すために私の記事を編集しました(間にいくつかの研究を行いました) –

関連する問題