1

速度の問題があるpythonプログラムの最適化に取り組んでいます。私は別のドキュメントで遊んでいましたが、プログラムに表示されたさまざまなものが実行の合計速度に影響を与える可能性があります。

見つけた:

a = 0
for x in range(10000000):
    a += x
return a 

以下よりもわずかに遅い:

a = 0
for x in range(10000000):
    a = a + x
return a 

最初のスクリプトの実行には 1.5 ~ 1.55 秒かかりますが、2 番目のスクリプトの実行には通常約 1.36 ~ 1.37 秒かかります (cProfile を使用)。

なぜこれが考えられるのでしょうか?ありがとう :)

4

2 に答える 2

11

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        
于 2013-07-20T13:11:04.347 に答える