2012-12-14 48 views
6

私は、ループ内のif文の速度とその速度への影響に関していくつかのテストを行っています。私が見つけたことは、一貫して、if-statementがパフォーマンスを改善したことでした。私のコード:whileループwhileループwhileループより高速

import time 
t = time.time 

start = t() 
x = 0 
while x < 10000000: 
    x += 1 
time1 = t() 
x = 0 
while x < 10000000: 
    x += 1 
    if True: 
     pass 
time2 = t() 

print(start) 
print(time1 - start) # Time for simple while-loop 
print(time2 - time1) # Time for while+if 

サンプル出力は次のようになります。完全に直感的である

1355517837.993 
1.7850000858306885 
1.7209999561309814 

。 while-if-loopは、標準while-loopよりも少し早く動作します。これは私がそれを実行するたびに起こります。おそらく20回に1回は長くかかります。なぜ誰が知っていますか?

+2

両方のタイムブロックから 'x = 0'を移動するとどうなりますか?あなたが見ているのは、インタプリタが最初のブロックに 'x'を割り当てなければならないが、2番目のブロックには' x 'を割り当てる必要があるということです。 –

+0

ここでは同じではありません。私は次のようなタイミングを持っています: '$ python t.py 1355519439.65 1.92616391182 2.65010595322'; Python 2.7.3で実行しました – Rubens

+0

ifループを最初に実行した後に結果を返します。私にとっては最初のものが常により速いです。 – Edu

答えて

3

私は、それが定数なので、コンパイラがTrueブロックを削除すると思います。

私が実行すると、私はあなたとほとんど反対の結果を得ます。私は単に実行環境のランダムな効果かもしれません。

1355519587.2 0.832797050476 1.04382395744

1355519590.03 0.863899946213 1.09347200394

1355519593.72 0.831655025482 1.05389809608

1355519599.71 0.831452131271 1.41783499718

1355519602.99 0.815280914307 1.05724310875

1355519605.72 0.826404094696 1.05700492859

1355519608.94 0.827296972275 1.07807898521

+1

どのエンジン?ジャストインタイムコンパイラなどはありません。少なくともCPythonではありません。実際、コンパイラはまったくありません。ここではPythonについて説明しています。 –

+0

が同意します。私の結果は以下の通りです:1355519852.98、0.830796003342、1.11595201492、Python 2.7.1 – alexvassel

+0

@TimPietzcker、それは2.7.1です。 Pythonはコンパイルしますが、バイトコードに変換します。ほとんどのオペレーティング環境でrawテキストを実行することはできません。 – Foo

5

DISは、whileループif文に複数のステップがあることを示しています。

In [4]: dis.dis(t2) 
    2   0 LOAD_CONST    1 (0) 
       3 STORE_FAST    0 (x) 

    3   6 SETUP_LOOP    26 (to 35) 
     >> 9 LOAD_FAST    0 (x) 
      12 LOAD_CONST    2 (10000000) 
      15 COMPARE_OP    0 (<) 
      18 POP_JUMP_IF_FALSE  34 

    4   21 LOAD_FAST    0 (x) 
      24 LOAD_CONST    3 (1) 
      27 INPLACE_ADD 
      28 STORE_FAST    0 (x) 
      31 JUMP_ABSOLUTE   9 
     >> 34 POP_BLOCK 
     >> 35 LOAD_CONST    0 (None) 
      38 RETURN_VALUE 

In [5]: dis.dis(t1) 
    2   0 LOAD_CONST    1 (0) 
       3 STORE_FAST    0 (x) 

    3   6 SETUP_LOOP    35 (to 44) 
     >> 9 LOAD_FAST    0 (x) 
      12 LOAD_CONST    2 (10000000) 
      15 COMPARE_OP    0 (<) 
      18 POP_JUMP_IF_FALSE  43 

    4   21 LOAD_FAST    0 (x) 
      24 LOAD_CONST    3 (1) 
      27 INPLACE_ADD 
      28 STORE_FAST    0 (x) 

    5   31 LOAD_GLOBAL    0 (True) 
      34 POP_JUMP_IF_FALSE  9 

    6   37 JUMP_ABSOLUTE   9 
      40 JUMP_ABSOLUTE   9 
     >> 43 POP_BLOCK 
     >> 44 LOAD_CONST    0 (None) 
      47 RETURN_VALUE 
+0

これを投稿していただきありがとうございます。私は今までにdisモジュールを認識していませんでした。しかしwhile-if-loopがより速く実行されることは今でも非常に混乱しています。 – Yos233