1. ホーム
  2. python

[解決済み] 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を選択します。