[解決済み] 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
のバージョンの方が大幅に速くなります。
関連
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] Pythonで例外を手動で発生(スロー)させる
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] JUnit 4のテストで、ある例外が投げられたことをどのように断言しますか?
-
[解決済み] Pythonで例外を表示するには?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み] なぜ(0-6)は-6=偽なのか?重複
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Pythonの辞書からキーを削除するにはどうしたらいいですか?
-
[解決済み] 引数の型に基づいて __init__ メソッドをオーバーロードするには?
-
[解決済み】与えられたキーがすでに辞書に存在するかどうかをチェックし、それをインクリメントする
-
[解決済み】try...catchはループの内側と外側のどちらで行うべきですか?
-
[解決済み] Pythonで'try'と'if'を使い分ける
-
[解決済み] django.db.migrations.exceptions.InconsistentMigrationHistory
-
[解決済み] 範囲指定された浮動小数点数のランダムな配列を生成します。
-
[解決済み] PythonのRequestsモジュールを使ってWebサイトに "ログイン "するには?
-
[解決済み] djangoのQueryDictをPythonのDictに変更するには?
-
[解決済み] Alembicアップグレードスクリプトでインサートやアップデートを実行するにはどうすればよいですか?