J'ai pensé qu'il serait intéressant de préciser les méthodes qui sont les plus rapides, et dans ce scénario:
Voici quelques tests, j'ai couru (sur un 2012 MacBook Pro)
>>> def method1(list,search_age):
... for name,age in list.iteritems():
... if age == search_age:
... return name
...
>>> def method2(list,search_age):
... return [name for name,age in list.iteritems() if age == search_age]
...
>>> def method3(list,search_age):
... return list.keys()[list.values().index(search_age)]
Les résultats de profile.run()
sur chaque méthode 100000 fois:
Méthode 1:
>>> profile.run("for i in range(0,100000): method1(list,16)")
200004 function calls in 1.173 seconds
Méthode 2:
>>> profile.run("for i in range(0,100000): method2(list,16)")
200004 function calls in 1.222 seconds
Méthode 3:
>>> profile.run("for i in range(0,100000): method3(list,16)")
400004 function calls in 2.125 seconds
Donc, cela montre que, pour un petit dict, la méthode 1 est la plus rapide. C'est probablement parce qu'elle renvoie le premier match, contrairement à tous les matchs comme méthode 2 (voir la note ci-dessous).
Il est intéressant de noter, d'effectuer les mêmes tests sur un dict que j'ai avec 2700 entrées, j'obtiens des résultats très différents (cette fois-run 10000 fois):
Méthode 1:
>>> profile.run("for i in range(0,10000): method1(UIC_CRS,'7088380')")
20004 function calls in 2.928 seconds
Méthode 2:
>>> profile.run("for i in range(0,10000): method2(UIC_CRS,'7088380')")
20004 function calls in 3.872 seconds
Méthode 3:
>>> profile.run("for i in range(0,10000): method3(UIC_CRS,'7088380')")
40004 function calls in 1.176 seconds
Donc, ici, la méthode 3 est beaucoup plus rapide. Va juste pour montrer la taille de votre dict affectera la méthode que vous choisissez.
Notes:
Méthode 2 renvoie une liste de tous les noms, alors que les méthodes 1 et 3 de retour seulement le premier match.
Je n'ai pas considéré l'utilisation de la mémoire. Je ne suis pas sûr si la méthode 3 crée 2 autres listes (keys() et values()) et les stocke dans la mémoire.