4

純粋にパフォーマンスの観点から、反復算術演算の結果を変数に代入し、その変数をコード全体で使用するのが一般的にベスト プラクティスですか? または、Python には、結果をキャッシュして、繰り返しステートメントに遭遇するたびにそれを使用する内部的な方法がありますか。

たとえば、これはより効率的です。

a = 50
b = a*12-1
c = a*b

print c
#some code
print c*100 + 10
#some code
print c/100 + 20
#etc

これより:

print 50*(50*12-1)
#some code
print 50*(50*12-1) * 100 + 10
#some code
print 50*(50*12-1) / 100 + 20
#etc
4

3 に答える 3

7

中間結果をキャッシュする Python 実装を知りません。ローカル変数のバインドは非常に安価であるため、数回の計算の後、より速く結果が得られます。

定数のみが使用される特殊なケースでは、ピープホール オプティマイザーはそれらを定数に減らすことができます。

例えば。

$ python3.3
Python 3.3.0 (default, Sep 29 2012, 17:17:45) 
[GCC 4.7.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> def x():
...     50*(50*12-1)
...     50*(50*12-1) * 100 + 10
...     50*(50*12-1) / 100 + 20
... 
>>> dis.dis(x)
  2           0 LOAD_CONST               9 (29950) 
              3 POP_TOP              

  3           4 LOAD_CONST              14 (2995010) 
              7 POP_TOP              

  4           8 LOAD_CONST              19 (319.5) 
             11 POP_TOP              
             12 LOAD_CONST               0 (None) 
             15 RETURN_VALUE         

疑わしい場合は、読み取り可能なバージョンを優先してください。余分なマイクロ秒が本当に必要な場合は、マイクロ最適化します

于 2013-07-23T00:56:35.720 に答える
2

私にはかなり無視できる速度のようです:

> python -m timeit 'a = 50; b = a*12-1; c = a*b; c; c*100+10; c/100+20;'
1000000 loops, best of 3: 0.27 usec per loop
> python -m timeit '50*(50*12-1); 50*(50*12-1) * 100 + 10; 50*(50*12-1) / 100 + 20'
1000000 loops, best of 3: 0.218 usec per loop

割り当ては、継続的に再計算するよりもわずかに遅くなりますが、korylprince がコメントで述べているように、割り当てによりコードが読みやすくなります。

編集:これはコメントでのニブラーの意味だと思いますが、それでも遅いです:

> python -m timeit 'def x(): a = 50; b = a*12-1; c = a*b; c; c*100+10; c/100+20;' 'x()'
1000000 loops, best of 3: 0.428 usec per loop

edit2: これは実際にコメントで gnibbler が意味するものであり、違いはまだごくわずかです。より読みやすいものを使用することについてのコメントはまだ保持されています:

> python -m timeit -s 'def x(): a = 50; b = a*12-1; c = a*b; c; c*100+10; c/100+20;' 'x()'
1000000 loops, best of 3: 0.367 usec per loop
> python -m timeit -s 'def x(): 50*(50*12-1); 50*(50*12-1) * 100 + 10; 50*(50*12-1) / 100 + 20' 'x()'
1000000 loops, best of 3: 0.278 usec per loop
于 2013-07-23T00:56:18.450 に答える
0

リテラルは、何も参照する必要がないという理由だけで高速になります。Python には前処理がないため、C のように #define を行うことはできません。

于 2013-07-23T00:47:32.483 に答える