Je créerais un dictionnaire :
options = {'this': doThis,'that' :doThat, 'there':doThere}
Maintenant, utilisez juste :
options.get(something, doThisMostOfTheTime)()
Si something
ne se trouve pas dans le options
dict alors dict.get
retournera la valeur par défaut doThisMostOfTheTime
Quelques comparaisons de temps :
script :
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
Para 10**5
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
Ainsi, pour un dictionnaire normal, la vérification de la clé en utilisant key in options
est le moyen le plus efficace ici :
if key in options:
options[key]()
else:
doSomethingElse()
0 votes
Pouvez-vous
sort
les éléments sur lesquels vous exécutez votre chaîne if/else..., de sorte que tous les éléments pour lesquels l'une des conditions correspondra se trouvent à une extrémité, et tous les autres à l'autre ? Si c'est le cas, vous pourriez voir si cela est plus rapide/plus élégant ou non. Mais rappelez-vous, s'il n'y a pas de problème de performance, il est trop tôt pour se préoccuper de l'optimisation.1 votes
Rel stackoverflow.com/questions/374239/
0 votes
@Patashu - Malheureusement, j'ai un énorme problème de performance. Ce programme fonctionne jour et nuit en analysant d'énormes quantités de données. C'est seulement parce que mes compétences en C++ ne sont pas à la hauteur (et j'adore Python) que je ne le réécris pas
4 votes
Les trois cas particuliers ont-ils quelque chose en commun ? Par exemple, vous pourriez faire
if not something.startswith("th"): doThisMostOfTheTime()
et faire une autre comparaison dans leelse
clause.0 votes
@TimPietzcker - Malheureusement, il n'y a pas vraiment quelque chose qu'ils ont en commun. Il peut s'agir de 3 nombres spécifiques ou d'une chaîne de caractères spécifique. Si c'est un autre nombre ou une autre chaîne de caractères (parmi plus de 2 000 options), il doit effectuer l'autre action.
3 votes
@kramer65 S'il s'agit d'une si longue chaîne de if/elif... ça peut être lent, mais assurez-vous d'avoir réellement... profil votre code et commencez par optimiser la partie qui prend le plus de temps.
1 votes
Ces comparaisons sont-elles effectuées une seule fois par valeur de
something
ou des comparaisons similaires sont-elles effectuées plusieurs fois sur la même valeur ?