で別の質問、受け入れ答えは、パフォーマンスを向上させるために、try / exceptブロックでPythonコードにif文(非常に安い)の交換を提案しました。
コーディングスタイルの問題は別として、例外がトリガーされないと仮定すると、例外ハンドラーがある場合とない場合と比較してゼロに比較するifステートメントがある場合と、例外ハンドラーがある場合とでは、パフォーマンスにどの程度の違いがありますか?
で別の質問、受け入れ答えは、パフォーマンスを向上させるために、try / exceptブロックでPythonコードにif文(非常に安い)の交換を提案しました。
コーディングスタイルの問題は別として、例外がトリガーされないと仮定すると、例外ハンドラーがある場合とない場合と比較してゼロに比較するifステートメントがある場合と、例外ハンドラーがある場合とでは、パフォーマンスにどの程度の違いがありますか?
回答:
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
バージョンが大幅に高速化されます。
try/except
より速いif a != 0
この質問は、デザインと歴史のFAQで実際に回答されています。
例外が発生しない場合、try / exceptブロックは非常に効率的です。実際に例外をキャッチするとコストがかかります。
この質問は誤解を招くものです。例外がトリガーされない場合は、どちらも最適なコードではありません。
例外がエラー条件の一部としてトリガーされると想定した場合、すでに最適なコードが必要な領域の外にいます(そして、とにかくそのようなきめの細かいレベルで例外を処理していない可能性があります)。
例外を標準の制御フローの一部として使用している場合-これはPythonicの「許可を求める、許可ではない」方法です-例外がトリガーされ、コストは例外の種類によって異なります。 、および例外が発生すると推定する時間の割合。