Pythonの例外ハンドラのコスト


97

別の質問、受け入れ答えは、パフォーマンスを向上させるために、try / exceptブロックでPythonコードにif文(非常に安い)の交換を提案しました。

コーディングスタイルの問題は別として、例外がトリガーされないと仮定すると、例外ハンドラーがある場合とない場合と比較してゼロに比較するifステートメントがある場合と、例外ハンドラーがある場合とでは、パフォーマンスにどの程度の違いがありますか?


6
測定したとき、何を学びましたか?
S.Lott


一部を除いて制御が行われる可能性が低い場合はtry / exceptを使用し、可能性が高い場合はif / elseを使用します。
shadow0359 16

回答:


112

timeitモジュールを使って測定してみませんか?これにより、アプリケーションに関連しているかどうかを確認できます。

OK、次のことを試してみました:

import timeit

statements=["""\
try:
    b = 10/a
except ZeroDivisionError:
    pass""",
"""\
if a:
    b = 10/a""",
"b = 10/a"]

for a in (1,0):
    for s in statements:
        t = timeit.Timer(stmt=s, setup='a={}'.format(a))
        print("a = {}\n{}".format(a,s))
        print("%.2f usec/pass\n" % (1000000 * t.timeit(number=100000)/100000))

結果:

a = 1
try:
    b = 10/a
except ZeroDivisionError:
    pass
0.25 usec/pass

a = 1
if a:
    b = 10/a
0.29 usec/pass

a = 1
b = 10/a
0.22 usec/pass

a = 0
try:
    b = 10/a
except ZeroDivisionError:
    pass
0.57 usec/pass

a = 0
if a:
    b = 10/a
0.04 usec/pass

a = 0
b = 10/a
ZeroDivisionError: int division or modulo by zero

したがって、期待どおり、例外ハンドラーがないことは少し高速です(ただし、例外が発生すると顔が爆発します)。条件が満たされない限りtry/except、明示より高速ですif

しかし、それはすべて同じ程度の大きさであり、どちらの方法でも問題になる可能性は低いです。条件が実際に満たされている場合のみ、ifバージョンが大幅に高速化されます。


3
面白い。だからtry/exceptより速いif a != 0
Thilo

10
ああ、すばらしい言葉の選択:「すべて同じ桁の範囲内にある」...例外を回避する多くの人は、10倍の速度になると期待してそうしているのではないかと思います。
Garrett Bluma

Python 2.7.5を使用して私のFedoraでコードを実行すると、a = 1の場合、「if」バージョン(0.08 usec / pass)は「try / except」バージョン(0.11 usec / pass)よりも高速です。
duleshi 2014年

@duleshi興味深い。x86 / x64なのかしら?または、おそらく異なるプロセッサ拡張ですか?
基本的な

58

この質問は、デザインと歴史のFAQで実際に回答されています。

例外が発生しない場合、try / exceptブロックは非常に効率的です。実際に例外をキャッチするとコストがかかります。


3
「非常に効率的」とはどのくらい効率的かと思っていたところです。どうやら、それは非常に単純な「if」ステートメントよりも高速です。
Thilo

あなたが投稿した抜粋は、デザインと歴史のFAQからです。
nitsas

多分「非常に効率的」とは、Javaで何が行われるかを意味します
ebk 2018年

18

この質問は誤解を招くものです。例外がトリガーされない場合は、どちらも最適なコードではありません

例外がエラー条件の一部としてトリガーされると想定した場合、すでに最適なコードが必要な領域の外にいます(そして、とにかくそのようなきめの細かいレベルで例外を処理していない可能性があります)。

例外を標準の制御フローの一部として使用している場合-これはPythonicの「許可を求める、許可ではない」方法です-例外がトリガーされ、コストは例外の種類によって異なります。 、および例外が発生すると推定する時間の割合。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.