少し不自然な実験で、Python の組み込み関数のいくつかを numpy の関数と比較したいと思いました。しかし、これらのタイミングを取り始めたとき、私は何か奇妙なことに気づきました.
私が次のように書いたとき:
import timeit
timeit.timeit('import math; math.e**2', number=1000000)
非常に統計的に有意な方法で、ほぼランダムに交互に 2 つの異なる結果が得られます。
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 ステートメントを次のように変更しました。
timeit.timeit('math.e**2', 'import math', number=1000000)
これは同様に約 0.1 秒と 0.4 秒を交互に繰り返しましたが、ジェネレーターとリスト内包表記を比較する実験を再実行したところ、今回は結果が反転しました。つまり、ジェネレーター式は定期的に 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を使用しています
ここで何が起こっているか知っている人はいますか?これは私には本当に奇妙に思えます。