2016-07-03 9 views
4

私は、どんなコードがより速く走るのだろうと思っていましたか?例えば、我々は変数x持っている:私はかなりそれを理解することはできませんもっと速く、 `もし` x`ならば ``もしx!= 0`ならば?

>>> def a(): 
...  if 0 == 0: return 
... 
>>> def b(): 
...  if 0: return 
...>>> timeit(a) 
0.18059834650234943 
>>> timeit(b) 
0.13115053638194007 
>>> 

if x!=0 : return 

または

if x: return 

を私ははtimeitに確認しようとした、とここでの結果です。

+6

変数 'x'の型を定義しない限り、この質問に対する回答はありません。 –

+2

'b'は' 0'が偽であるのでより高速ですが、他のすべての数字は真実ですので、2つではなく1つの操作しか実行しません。 –

+1

@EliSadoff ...私は確かにaが高速だったクラスを書くことができました。つまり、あなたが前提をしていると言えます。 :) –

答えて

15

これはコメントに表示するにはあまりにも難しいです:これまでに述べたコメントよりもここには多くの(または少ない;-))があります。 a()あなたが示したように定義b()では、の上で行ってみましょう:

>>> from dis import dis 
>>> dis(b) 
    2   0 LOAD_CONST    0 (None) 
       3 RETURN_VALUE 

何が起こることはCPythonのコンパイラはif 0:またはif 1:を見たとき、それはコンパイル時でそれらを評価し、任意のコードを生成しませんということです実行時にテストを行います。したがって、b()のコードはNoneをロードして返します。

しかしa()のために生成されたコードははるかに複雑である:

>>> dis(a) 
    2   0 LOAD_CONST    1 (0) 
       3 LOAD_CONST    1 (0) 
       6 COMPARE_OP    2 (==) 
       9 POP_JUMP_IF_FALSE  16 
      12 LOAD_CONST    0 (None) 
      15 RETURN_VALUE 
     >> 16 LOAD_CONST    0 (None) 
      19 RETURN_VALUE 

何もこの場合には、コンパイル時に評価されていない - それは、すべての実行時に行われます。だからa()ははるかに遅いです。

それ以外にも、@Charles Duffyのコメント:マイクロ最適化についての心配は通常、Pythonでは逆効果です。しかし、もしあなたが;-)でなければならない場合は、dis.disの使い方を学んでください。総計この特定のケースで起こったように、生成されたコードの違い。

関連する問題