2013-08-08 23 views
18

if TrueがPythonでif 1より遅いのはなぜですか? if Trueif 1より速いはずですか?Trueの方が1よりも遅いのはなぜですか?

私はtimeitモジュールを習得しようとしていました。基礎から始めて、私が試したこれら:私はこれらの事で混乱しています

>>> def test1(): 
...  if True: 
...   return 1 
...  else: 
...   return 0 

>>> print timeit("test1()", setup = "from __main__ import test1") 
0.193144083023 


>>> def test2(): 
...  if 1: 
...   return 1 
...  else: 
...   return 0 

>>> print timeit("test2()", setup = "from __main__ import test2") 
0.162086009979 


>>> def test3(): 
...  if True: 
...    return True 
...  else: 
...    return False 

>>> print timeit("test3()", setup = "from __main__ import test3") 
0.214574098587 

>>> def test4(): 
...  if 1: 
...    return True 
...  else: 
...    return False 

>>> print timeit("test4()", setup = "from __main__ import test4") 
0.160849094391 

  1. this question氏シルヴァンDefresneからの応答によると、すべてが暗黙のうちにbool最初に変換され、チェックした。だからif Trueif 1より遅いのはなぜですか?
  2. returnの値だけが異なっていても、がtest1より遅いのはなぜですか?
  3. 質問2と同様ですが、なぜtest4少しですよりtest2

注:私はtimeitを3回実行し、結果の平均を取った後、コードと共にこの時間を掲載しました。

この質問は、私がこの例で行ったことですが、それはあまりにも基本的であると理解していますが、なぜ '真'変数をチェックするのが定数よりも遅いのかとは関係ありません。

+0

あなたのテストは小さすぎると思います。そして3回の実行の平均は十分ではありません:p – keyser

+0

私は理解しています:)でも、テストケースは考えるのはあまりにも基本的です。しかし、我々はどこか右に開始する必要があります:) – thiruvenkadam

+0

可能な複製[どのくらいのマイクロベンチマークを実行する必要がありますか?](http://stackoverflow.com/questions/2857470/how-long-does-a-microbenchmark-need- –

答えて

23

TrueFalsePython 2のキーワードではありません。

実行時に解決する必要があります。これは、Python 3にPython 3

同じ試験で変更された:

>>> timeit.timeit('test1()',setup="from __main__ import test1", number=10000000) 
2.806439919999889 
>>> timeit.timeit('test2()',setup="from __main__ import test2", number=10000000) 
2.801301520000038 
>>> timeit.timeit('test3()',setup="from __main__ import test3", number=10000000) 
2.7952816800000164 
>>> timeit.timeit('test4()',setup="from __main__ import test4", number=10000000) 
2.7862537199999906 

時間誤差は許容可能である1%です。

+2

「True、False = False、True' – Kabie

17

バイトコードの分解により違いが明らかになります。

>>> dis.dis(test1) 
    2   0 LOAD_GLOBAL    0 (True) 
       3 JUMP_IF_FALSE   5 (to 11) 
       6 POP_TOP    

    3   7 LOAD_CONST    1 (1) 
      10 RETURN_VALUE   
     >> 11 POP_TOP    

    5   12 LOAD_CONST    2 (0) 
      15 RETURN_VALUE   
      16 LOAD_CONST    0 (None) 
      19 RETURN_VALUE   

Kabieが述べたように、TrueFalseは、原料の多くは、それらにアクセスするために起こっているのPython 2でグローバルです。

>>> dis.dis(test2) 
    3   0 LOAD_CONST    1 (1) 
       3 RETURN_VALUE   

Pythonのコンパイラは、常に「truthy」表現として1を認識し、離れて冗長な条件を最適化することができました!

>>> dis.dis(test3) 
    2   0 LOAD_GLOBAL    0 (True) 
       3 JUMP_IF_FALSE   5 (to 11) 
       6 POP_TOP    

    3   7 LOAD_GLOBAL    0 (True) 
      10 RETURN_VALUE   
     >> 11 POP_TOP    

    5   12 LOAD_GLOBAL    1 (False) 
      15 RETURN_VALUE   
      16 LOAD_CONST    0 (None) 
      19 RETURN_VALUE   

ほとんどtest1と同じ、1以上LOAD_GLOBALと。

>>> dis.dis(test4) 
    3   0 LOAD_GLOBAL    0 (True) 
       3 RETURN_VALUE   

test2を参照してください。しかし、LOAD_GLOBALは、LOAD_CONSTより少し高価です。

関連する問題