如何最高效地编写if-elif-elif-else语句,其中else的情况最多?
如何最高效地编写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日
我将创建一个字典:
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()