2016-06-30 1 views
2

私は、ユーザーの入力を解析し、ファイルを読み込んで、何らかの作業をしてから、html POSTリクエストを送信するスクリプトを書いています。パフォーマンスヒットif:pass文

3つの変数の相互作用に基づいて別のアクションを実行する必要があるコードセクションは1つありますが、ケースの一部は「何もしない」つまりpassで処理されます。最初に、このスクリプト/ Pythonに慣れていない他の従業員の保守性を助けるために、条件付きパスのすべてをpassに含めました。

だからこの情報で、私の質問は:

私はこれらのpassのパスを削除した場合、パフォーマンスの高速化のいずれかの種類がありますか?これらのステートメントは、他の場所にインポートされるモジュールにはなく、コマンドラインから実行されます。

元のコードは、次のようなものです:

if var1 is not None: 
    if var3 == var1 or var3 == 'SPECIFIC VALUE': 
     xml.update_element() 
     xml.remove_element() 
    elif var2 == var3: 
     pass 
    else: 
     xml.update_element() 
else: 
    if var3 == 'SPECIFIC VALUE': 
     pass 
    elif var2 != var3: 
     xml.update_element() 
     xml.create_element() 

そして、私はそれを変更する:あなたがに行く複雑な条件を評価する必要がある場合にのみ、実際のパフォーマンスヒットがなる

if var1 is not None: 
    if var3 == var1 or var3 == 'SPECIFIC VALUE': 
     xml.update_element() 
     xml.remove_element() 
    elif var2 != var3: 
     xml.update_element() 
else: 
    if var3 != 'SPECIFIC VALUE' and var2 != var3: 
     xml.update_element() 
     xml.create_element() 
+0

です。あなたのコードを私たちに教えてください。 – shx2

+1

もちろん、実行するコードが少なくて済みます。質問は、あなたは本当にそのパフォーマンスペナルティに気を配っていますか?私はI/Oがあなたのスクリプトのボトルネックになるだろうと思っています。 –

+0

おそらくそうです。そして、これはより多くの意見になりますが、他の人にとっては複雑かもしれない条件文の保守性にとって重要なものですか? – arewm

答えて

1

多くの場合、条件が実際にプログラムを高速化する場合(コードブロックをスキップしているため)しかし、ブロック内で何も行われないので、そうではありません。

チェックする条件に処理が必要な場合は、if文の数が多いとコード実行が遅くなります。 sum(alist) == 0場合、ループチェックを通して

while True: 
    if sum(alist) == 0: 
     pass 

すべての反復:例では、(単にポイントを作るために、それは何もしない)ようなものになるだろう。これは、すべての反復が、変更されている可能性があるため、インタープリタは配列の要素を合計しなければならないことを意味します。

passのブロックでは、大きな違いはありませんが、チェックする条件によって異なります。それらの順序は、プログラムそのものに依存します。

if文が多すぎると、コードの可読性が低下する可能性があります。多くの場合、コードの動作に影響を与えることなく条件を削除できれば、それを最初から始める必要はありません。

示されている変更については、(外側の)ifブロックに違いはありません。どちらの場合も、チェックする条件が2つあるため、実質的に同じである必要があります。

if var1 is not None: 
    ## CONDITION 1 
    if var3 == var1 or var3 == 'SPECIFIC VALUE': 
     xml.update_element() 
     xml.remove_element() 
    ## CONDITION 2 
    elif var2 != var3: 
     xml.update_element() 

しかし、あなたは、いくつかのケースではあなたには、いくつかの時間を節約するための条件の一つを取り出し(そして、より読みやすい)(外側)elseブロック上:変更されたバージョンで

if var1 is not None: 
    ## CONDITION 1 
    if var3 == var1 or var3 == 'SPECIFIC VALUE': 
     xml.update_element() 
     xml.remove_element() 
    ## CONDITION 2 
    elif var2 == var3: 
     pass 
    ## NO CONDITION TO CHECK 
    else: 
     xml.update_element() 

else: 
    ## CONDITION 1 
    if var3 == 'SPECIFIC VALUE': 
     pass 
    ## CONDITION 2 
    elif var2 != var3: 
     xml.update_element() 
     xml.create_element() 

修正版でいる間:

else: 
    ## ONLY 1 CONDITION 
    if var3 != 'SPECIFIC VALUE' and var2 != var3: 
     xml.update_element() 
     xml.create_element() 

それが重要であるか、あなたのタイミングのテストだけではなく伝えることができます。条件は少し複雑ですが、var3 == 'SPECIFIC VALUE'の場合はすぐにfalseを返し、2番目の条件はチェックされません。

+0

私が作成した条件は要件に基づいているため、それぞれの条件には希望の動作に関するコメントがあります。この場合は可読性を妨げる可能性がありますが、おそらく理解に役立ちます。 – arewm

0

その声明私はコードのスニペットを見なければならないでしょうが、ブロックの最上部付近で最も単純で最も一般的な条件をチェックし、continue対pass(iterableの場合)を使用するか、早ければ(関数の場合)

+0

投稿はコードで更新されましたが、これらの条件は実際には複雑ではありません。だから私の早すぎる最適化はおそらくそれの価値がありません – arewm

+0

合意した、私はあなたがこの場合にそれについて心配する必要はないと思う! – Alec

2

私の助言は、読みやすくするためです:あなたのコードを多くの人が読んでもらえれば、できるだけ簡単かつ分かりやすいものにしてください。それ以外のものは早すぎる最適化です。

the timeit moduleで実際にテストを行い、速度の向上が重要かどうかを判断できます。そうでない場合は、忘れてしまい、プログラムを読めるままにしておいてください。

+0

私は、より大きなボトルネック分のパフォーマンスの向上、または他の人がコードのロジックをよりよく理解していますか?それは私には、2番目のケースが最初にすべきであると思われる。 – Jeff

+0

すべての人が早すぎる最適化を避けるように指示します。 :D – arewm

関連する問題