1. ホーム
  2. python

[解決済み] Pythonの例外ハンドラのコスト

2022-08-21 14:59:18

質問

別の質問 で、受け入れられた回答は、パフォーマンスを改善するためにPythonコードのif文(非常に安価な)をtry/exceptブロックに置き換えることを提案しました。

コーディングスタイルの問題はさておき、そして例外が決してトリガーされないと仮定して、例外ハンドラを持つことと、持たないことと、比較ゼロの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 のバージョンの方が大幅に速くなります。