如何最高效地编写if-elif-elif-else语句,其中else的情况最多?

38 浏览
0 Comments

如何最高效地编写if-elif-elif-else语句,其中else的情况最多?

我有一个if-elif-elif-else语句,在其中99%的时间里,else语句会被执行:

if something == 'this':
    doThis()
elif something == 'that':
    doThat()
elif something == 'there':
    doThere()
else:
    doThisMostOfTheTime()

这种结构被频繁使用,但由于它在到达else之前检查每个条件,所以我感觉这不是很高效,更别提Pythonic了。另一方面,它确实需要知道是否满足这些条件,因此它仍然需要进行测试。

是否有人知道如何更有效地完成这个任务,或者这是最好的方法?

admin 更改状态以发布 2023年5月21日
0
0 Comments

我将创建一个字典:

options = {'this': doThis,'that' :doThat, 'there':doThere}

现在只需使用:

options.get(something, doThisMostOfTheTime)()

如果在 options 字典中找不到 something,那么 dict.get 将返回默认值 doThisMostOfTheTime

一些时间比较:

脚本:

from random import shuffle
def doThis():pass
def doThat():pass
def doThere():pass
def doSomethingElse():pass
options = {'this':doThis, 'that':doThat, 'there':doThere}
lis = range(10**4) + options.keys()*100
shuffle(lis)
def get():
    for x in lis:
        options.get(x, doSomethingElse)()
def key_in_dic():
    for x in lis:
        if x in options:
            options[x]()
        else:
            doSomethingElse()
def if_else():
    for x in lis:
        if x == 'this':
            doThis()
        elif x == 'that':
            doThat()
        elif x == 'there':
            doThere()
        else:
            doSomethingElse()

结果:

>>> from so import *
>>> %timeit get()
100 loops, best of 3: 5.06 ms per loop
>>> %timeit key_in_dic()
100 loops, best of 3: 3.55 ms per loop
>>> %timeit if_else()
100 loops, best of 3: 6.42 ms per loop

对于 10**5 个不存在的键和 100 个有效键:

>>> %timeit get()
10 loops, best of 3: 84.4 ms per loop
>>> %timeit key_in_dic()
10 loops, best of 3: 50.4 ms per loop
>>> %timeit if_else()
10 loops, best of 3: 104 ms per loop

因此,在普通字典中使用 key in options 检查键是最有效的方法:

if key in options:
   options[key]()
else:
   doSomethingElse()

0