2013-09-01 4 views
5

少し巧妙な実験で、私はPythonの組み込み関数のいくつかをnumpyのものと比較したいと考えました。私はこれらのタイミングを開始したとき、私は奇妙な何かを発見した。Pythonのtimeitと非常に異なる2つの非常に一貫性のある結果

私は次のように書いた:

import timeit 
timeit.timeit('import math; math.e**2', number=1000000) 

私は非常に統計学的に有意な方法で、ほぼランダム交互に二つの異なる結果になるだろう。

これは2秒と0.5秒の間で交互に切り替わります。

私は混乱しているので、何が起こっていたのか理解するためにいくつかの実験を行いましたが、私はもっと混乱しました。だから私は次の実験を試みた:

[timeit.timeit('import math; math.e**2', number=1000000) for i in xrange(100)] 

これは完全に0.5の数字につながった。

test = (timeit.timeit('import math; math.e**2', number=1000000) for i in xrange(100)) 
[item for item in test] 

2.0数の完全なリストにつながった:私は、発電機でこれを播種みました。 alecxeの提案に

は私がに私はtimeitステートメントを変更:同様に約0.1〜0.4秒の間で交互に

timeit.timeit('math.e**2', 'import math', number=1000000) 

が、私は発電機と、リストの内包表記を比較した実験が、今回の結果をreranときフリップされた。つまり、ジェネレータの表現は定期的に0.1秒の数字が出てきたのに対して、リストの理解は0.4秒の完全なリストを返しました。

ダイレクトコンソール出力:

>>> test = (timeit.timeit('math.e**2', 'import math', number=1000000) for i in xrange(100)) 
>>> test.next() 
0.15114784240722656 

>>> timeit.timeit('math.e**2', 'import math', number=1000000) 
0.44176197052001953 
>>>  

編集:私はDWMを実行しているのUbuntu 12.04を使用している、と私は、これらの結果xtermの中やgnome-terminalの両方を見てきました。私はPythonを使用しています。2.7.3

ここで何が起こっているのか分かりませんか?これは私にとって本当に奇妙なようです。

+0

import文を次のように2番目の引数に移動するとどうなりますか? 'timeit.timeit '' math.e ** 2 '、' import math '、number = 1000000) '? – alecxe

+0

@alecxe提案していただきありがとうございます。さらに奇妙な結果。今投稿する。 –

+0

私はそれを試してみるのと同じようなものは見えません。 – user2357112

答えて

0

ここではいくつかのことが起こっていますが、明らかにこれらのいくつかの不具合は私のマシンに特有のものですが、誰かが同じことに困惑した場合に投稿する価値があると判断します。 import文が遅延ロードされている

timeit.timeit('math.e**2', 'import math', number=1000000) 

まず、その二つはtimeit機能間で異なるがあります。それは直接リスト内包で実行されたときに、このimport文は、すべてのエントリのためにロードされていたようなので、それが見えます

timeit.timeit('1+1', number=1000000) 

:対

timeit.timeit('1+1', 'import math', number=1000000) 

:あなたは次の実験をしようとするとこれが顕著になります。 (正確な理由はおそらく私の設定に関係しているでしょう)。

過去の質問に戻ると、3/4の時間が実際に費やされたインポート数学のように見えるので、式が生成されたときに繰り返しの間にキャッシュ記憶域が存在しないと推測しています。リスト内の読み込みキャッシングがありました(これは正確な理由はおそらく設定固有のものです)

関連する問題