2009-08-10 4 views
14

timeit()の外で以下のコードを実行すると、瞬間的に完了するようです。しかし、timeit()関数内で実行すると、時間がかかります。どうして?python:slow timeit()function

>>> import timeit 
>>> t = timeit.Timer("3**4**5") 
>>> t.timeit() 
16.55522028637718 

使用: のPython 3.1(x86の) - AMDのAthlon 64 X2 - WinXPのtimeit()機能コード多数回(デフォルトの百万)を実行し、平均を取る

+0

ページアレックスMartelli、アレックスMartelli、python timeitモジュールにコメントしてください... – hughdbrown

+0

RichieHindleは既に私がオフラインであった間にそれを正しく持っています。そして、私はいつも "python -mtimeit"を使っています。インタラクティブなインタプリタやプログラム内でタイムアウトしないでください;-) –

答えて

26

(32ビット)タイミング。

これを行うと、一度だけのコードを実行するには、次の

t.timeit(1) 

をそれはあなたに偏った結果が得られます - それは正当な理由のために繰り返されます。

ループごとの時間を取得するには、結果をループ数で割ります。

count = 1000 
print t.timeit(count)/count 
+6

Yep!私はまた、モジュールとしてtimeitの代わりにコマンドラインから 'python -mtimeit'を使うことをお勧めします。コマンドラインバージョンは、あなたがモジュールから手に入らないほんの少しの便利なものを持っています(どのようにあなたが測定しているものは遅い/速いものです。たとえば、素晴らしいマイクロベンチマーキング技術、モジュールが提供していない同情など----)。 –

+0

@Alexここにあなたのコメントは私には分かりません。 CLIで利用できる特別な機能を明確にすることはできますか? – Tshepang

+1

@Tshepang:CLIはtimeitの繰り返し回数を「魔法のように」選択します。遅いコードを測定する場合は少なく、コードを高速にする場合は非常に多く、非常に高速なコードを使用する場合は多く、結果を得るためには時間と正確にバランスを取る必要があります。 –

6

それを100万回を実行するにはtimeitデフォルトなので:百万はあまりにも多くの場合は繰り返し回数の値を小さくしてください。要点はマイクロベンチマークを行うことです。短いイベントの正確なタイミングを取得する唯一の方法は、それらを何度も繰り返すことです。

3

docsによると、Timer.timeit()はデフォルトで100万回コードを実行します。このデフォルトを変更するには、「番号」パラメータを使用します。

t.timeit(number=100) 

たとえば、

2

Timeitは、デフォルトで100万回実行されます。

操作の問題がある可能性があります。(3**4)**5 != 3**4**5

+0

ありがとうございます。非常に役立ちます。そして、はい、それは意図された操作の順序でした。 –