[解決済み] if-elif-elif-else文の最も効率的な作り方は、elseが最も多く行われる時か?
2022-09-17 10:27:08
質問
if-elif-elif-else文で、99%の確率でelse文が実行されるものがあります。
if something == 'this':
doThis()
elif something == 'that':
doThat()
elif something == 'there':
doThere()
else:
doThisMostOfTheTime()
この構成は たくさん が、elseを打つ前にすべての条件を確認するので、Pythonicどころか、あまり効率的でない気がしています。一方、これらの条件のいずれかが満たされているかどうかを知る必要があるので、とにかくそれをテストする必要があります。
誰かこれがもっと効率的にできるのか、それとも単にこれが最善の方法なのか知っていますか?
どのように解決するのですか?
コードは...
options.get(something, doThisMostOfTheTime)()
...もっと速くなるはずのように見えますが、実際には
if
...
elif
...
else
という構文は、関数を呼び出す必要があるため、タイトなループではかなりのパフォーマンスオーバーヘッドとなります。
以下の例を考えてみましょう。
1.py
something = 'something'
for i in xrange(1000000):
if something == 'this':
the_thing = 1
elif something == 'that':
the_thing = 2
elif something == 'there':
the_thing = 3
else:
the_thing = 4
2.py
something = 'something'
options = {'this': 1, 'that': 2, 'there': 3}
for i in xrange(1000000):
the_thing = options.get(something, 4)
3.py
something = 'something'
options = {'this': 1, 'that': 2, 'there': 3}
for i in xrange(1000000):
if something in options:
the_thing = options[something]
else:
the_thing = 4
4.py
from collections import defaultdict
something = 'something'
options = defaultdict(lambda: 4, {'this': 1, 'that': 2, 'there': 3})
for i in xrange(1000000):
the_thing = options[something]
...そして、それらが使用するCPU時間の量に注意してください...
1.py: 160ms
2.py: 170ms
3.py: 110ms
4.py: 100ms
...ユーザータイムを使って
time(1)
.
オプション#4は、個別のキーミスごとに新しい項目を追加するという追加のメモリオーバーヘッドがあります。したがって、個別のキーミスが無限に発生することを想定している場合は、オプション#3を選択します。
関連
-
[解決済み] リストをチャンクで反復処理する最も "pythonic "な方法は何ですか?
-
[解決済み】pandasでdataframeをループする最も効率的な方法は何ですか?
-
[解決済み】numpyの配列を逆引きする最も効率的な方法
-
[解決済み】2つの範囲が重なっているかどうかをテストする最も効率的な方法は何ですか?
-
[解決済み】Pylintで条件値のlen(SEQUENCE)の使用が正しくないとされるのはなぜですか?
-
[解決済み] if-elif-else文を1行にまとめる?
-
[解決済み】Bashのif, elif, else文の問題点
-
[解決済み] PythonでファイルのMD5チェックサムを計算するには?重複
-
[解決済み] Flaskで1時間ごとに関数を実行するようにスケジュールするには?
-
[解決済み] Celeryタスクのユニットテストはどのように行うのですか?
最新
-
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のマルチプロセッシングプールimap_unorderedの呼び出しの進捗を表示しますか?
-
[解決済み] SQLAlchemy: セッションの作成と再利用
-
[解決済み] googletransがエラー 'NoneType' オブジェクトに 'group' 属性がない、と言って動かなくなった。
-
[解決済み] タプルのリストを複数のリストに変換するには?
-
[解決済み] 文字列から先頭と末尾のスペースを削除するには?
-
[解決済み] PythonからSMTPを使用してメールを送信する
-
[解決済み] 異なる順序で同じ要素を持つ2つのJSONオブジェクトを等しく比較するには?
-
[解決済み] 新しいpip backtrackingの実行時問題の解決
-
[解決済み] Pythonでリストが空かどうかをチェックする方法は?重複