2013-07-10 6 views
10

時には、実行するコードの部分がどれくらい時間がかかるかを時々気に入っています。私は多くのオンラインサイトを調べて、これを行うための大きな2つの主要な方法を見てきました。 1つはtime.timeを使用し、もう1つはtimeit.timeitを使用しています。time.timeとtimeit.timeit

だから、私は2つを比較することは非常に簡単なスクリプトを書いた:

from timeit import timeit 
from time import time 
start = time() 
for i in range(100): print('ABC') 
print(time()-start, timeit("for i in range(100): print('ABC')", number=1)) 

基本的に時間をそれがforループで「ABC」100回を印刷するのにかかる時間。左側の数字はtime.timeの結果、右の数字はtimeit.timeitのためである:あなたが見ることができるように

# First run 
0.0 0.012654680972022981 
# Second run 
0.031000137329101562 0.012747430190149865 
# Another run 
0.0 0.011262325239660349 
# Another run 
0.016000032424926758 0.012740166697164025 
# Another run 
0.016000032424926758 0.0440628627381413 

は、時々、time.timeが速くなり、時にはそれが遅くなります。どちらが良い方法ですか(より正確です)?

+6

タイミングチャンクのコードには、timeitが適しています。これは 'time.time()'(Windowsでは 'time.clock()'を使います)、ガベージコレクタを無効にします。また、1回の試行では十分ではありません。 – Blender

+0

@Blender: 'timeit'はPython 3.3以降で' time.perf_counter'を使います。 – jfs

+0

@ J.F.Sebastian:ありがとう、私はそれを知らなかった。 – Blender

答えて

25

timeitは三つの理由のために、より正確である:

  • それは、このようなディスクフラッシュとOSのスケジューリングなど、あなたのマシン上で他のタスクの影響を排除するためのテストを何度も繰り返されます。
  • ガベージコレクタを無効にして、不適切な瞬間にコレクションの実行をスケジュールすることによって、そのプロセスが結果を歪曲させないようにします。
  • Python 2ではtime.timeまたはtime.clock、Python 3ではtime.perf_counter()が最も正確なタイマーを選択します。を参照してください。
+0

これらの3つのことを明示的に行うと、timeitと同じ正確な結果が得られますか?私のユースケースでは、さまざまな入力を使って多くのテストを実行していますので、timeitを使用しない方が簡単かもしれません。 – Annan

+1

@Annan:なぜこの車輪を再発明するのですか?何かを繰り返して実行することが何を意味しているのかを理解すれば、どのようなユースケースを思いついても、それは 'timeit'によって供給することができます。低摩擦の繰り返し範囲に 'itertools.repeat(None、repetitioncount) 'を使用するなど、' timeit'が使用する小さなトリックがいくつかあります。これは、'正確な ' 'timeit'が得られます。 –

関連する問題