timeit
モジュールを使用して、適切なタイミングを実行します。よくある落とし穴を回避し、プラットフォームに最も正確なタイマーの実装を使用し、テストされたコードを何度も繰り返すことで OS スケジューリングの影響を最小限に抑えようとします。
一方、プロファイラーを使用すると、コール スタック全体の計測をサポートするために多くのオーバーヘッドが追加されます。timeit
スタック内の個々の呼び出しではなく、完全な実行時間を測定します。
を使用timeit
すると、2 つのバージョンが近すぎて呼び出すことができません (デフォルトは 100 万回の反復)。
>>> timeit.timeit('a += x', 'a = x = 1')
0.047940969467163086
>>> timeit.timeit('a = a + x', 'a = x = 1')
0.04770612716674805
どちらの操作も1 つのバイトコードです。
>>> def f(): a += x
...
>>> def g(): a = a + x
...
>>> import dis
>>> dis.dis(f)
1 0 LOAD_FAST 0 (a)
3 LOAD_GLOBAL 0 (x)
6 INPLACE_ADD
7 STORE_FAST 0 (a)
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
>>> dis.dis(g)
1 0 LOAD_FAST 0 (a)
3 LOAD_GLOBAL 0 (x)
6 BINARY_ADD
7 STORE_FAST 0 (a)
10 LOAD_CONST 0 (None)
13 RETURN_VALUE