2016-10-09 8 views
0

スクリプトの速度に関して、Pythonの条件をどのように並べるのが重要ですか?たとえばSQLの場合。 「通訳者」がどの条件の発注が最も速いかを想定しているわけではありません。条件の順序はパフォーマンスに影響しますか?

私が知る限り、条件の順番は通訳者の指示どおりです。例として、私が連鎖または条件であれば、最初の条件が適用されないときに通訳者が他の条件を探すことさえできなくなるので、消費時間を想定して条件を整理する方が良いでしょうか?

答えて

5

はい、条件の順序は重要です。たとえば、カッコを使用して変更しない限り、左から右へ評価されます。

はい、条件は、式の結果がまだ明確でない場合にのみ評価されます。例えば、

if 1==0 and foo**10000 > 2: 

PythonはすぐにFalseを返し、さらにはfoo**10000を計算しようとしません。

+2

「10000 ** 10000」はコンパイラによって計算されます。 'foo ** 10000'が良い例かもしれません。 – tdelaney

+0

提案をありがとう!ずっといい。 –

2

PythonはSQLのように条件を並べ替えませんが、short circuitになります。これは、できるだけ早く評価を中止することを意味します。したがって、if True == True or long_function_call():がある場合、long_function_call()は評価されません。 andの場合も同様で、if True == False and long_function_call():のようになります。条件文を書くときにこれを検討し、パフォーマンスを変える可能性があるのは、あなたの最善の利益になります。

1

Pythonのブール演算子はshort-circuitingです。式の結果がクリアされるとすぐに評価は停止します。これは、Pythonの遅延バインディングで重要な役割を果たします。

例えば、これは一般的なチェックです:

def do(condition_check=None): 
    if condition_check is not None and condition_check(): 
     # do stuff 

Pythonは、一般的には時期尚早の最適化について非常に保守的です。何かが壊れる可能性がある場合、Pythonはそれを試しません。

インタープリタの最適化を確認する場合は、disモジュールを試してみてください。 Pythonコアによって実際に実行される命令を示しています。たとえば、Pythonは定数式(10**10 =>10000000000)を解決し、andJUMP_IF_FALSE_OR_POP)から復帰します。

dis.dis('1==0 and 10**10 > 2') 
    1   0 LOAD_CONST    0 (1) 
       3 LOAD_CONST    1 (0) 
       6 COMPARE_OP    2 (==) 
       9 JUMP_IF_FALSE_OR_POP 21 
      12 LOAD_CONST    4 (10000000000) 
      15 LOAD_CONST    3 (2) 
      18 COMPARE_OP    4 (>) 
     >> 21 RETURN_VALUE 

このコードでは、pypyでさえ最適化されていないことに注意してください。

関連する問題