Je créerais un dictionnaire:
options = {'this': doThis,'that' :doThat, 'there':doThere}
Maintenant, utilisez simplement:
options.get(something, doThisMostOfTheTime)()
Si something
n'est pas trouvé dans le options
dict alors dict.get
retournera la valeur par défautdoThisMostOfTheTime
Quelques comparaisons de temps:
Scénario:
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()
Résultats:
>>> 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
Pour 10**5
les clés inexistantes et 100 clés valides:
>>> %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
Donc, pour un dictionnaire normal, vérifier la clé en utilisant key in options
est le moyen le plus efficace ici:
if key in options:
options[key]()
else:
doSomethingElse()
sort
les choses sur lesquelles vous exécutez votre chaîne if / else ..., de telle sorte que tous les éléments auxquels l'une des conditions correspondra soient à une extrémité et tous les autres à l'autre? Si c'est le cas, vous pouvez voir si c'est plus rapide / plus élégant ou non. Mais rappelez-vous, s'il n'y a pas de problème de performances, il est trop tôt pour s'inquiéter de l'optimisation.