Je me demande ce qu'il vaut mieux faire:
d = {'a': 1, 'b': 2}
'a' in d
True
ou:
d = {'a': 1, 'b': 2}
d.has_key('a')
True
python
dictionary
igorgue
la source
la source
keys()
c'est juste une vue d'ensemble dans un dictionnaire plutôt qu'une copie, toutx in d.keys()
comme O (1). Pourtant,x in d
c'est plus Pythonic.x in d.keys()
doit construire et détruire un objet temporaire, avec l'allocation de mémoire qui en découle, oùx in d.keys()
fait juste une opération arithmétique (calcul du hachage) et fait une recherche. Notez que ced.keys()
n'est que 10 fois plus long que cela, ce qui n'est pas vraiment long. Je n'ai pas vérifié mais je suis toujours sûr que ce n'est que O (1).in
gagne haut la main, non seulement en élégance (et en n'étant pas déprécié ;-) mais aussi en performance, par exemple:Bien que l'observation suivante ne soit pas toujours vraie, vous remarquerez qu'en général , en Python, la solution la plus rapide est plus élégante et Pythonique; c'est pourquoi
-mtimeit
est si utile - il ne s'agit pas seulement d'économiser une centaine de nanosecondes ici et là! -)la source
has_key
semble être O (1) aussi.Selon les documents python :
la source
has_key()
est maintenant supprimé dans Python 3Utilisez
dict.has_key()
si (et seulement si) votre code doit être exécutable par les versions Python antérieures à 2.3 (lors dekey in dict
son introduction).la source
Il y a un exemple où
in
tue réellement votre performance.Si vous utilisez
in
sur un conteneur O (1) qui implémente uniquement__getitem__
ethas_key()
non,__contains__
vous transformerez une recherche O (1) en recherche O (N) (comme celain
revient à une recherche linéaire via__getitem__
).Le correctif est évidemment trivial:
la source
has_key()
est spécifique aux dictionnaires Python 2 .in
/__contains__
est la bonne API à utiliser; pour les conteneurs où une analyse complète est inévitable, il n'y a de toute façon pas dehas_key()
méthode , et s'il existe une approche O (1), ce sera spécifique au cas d'utilisation et donc au développeur de choisir le bon type de données pour le problème.has_key
est une méthode de dictionnaire, maisin
fonctionnera sur n'importe quelle collection, et même lorsqu'elle__contains__
est manquante,in
utilisera toute autre méthode pour itérer la collection pour le découvrir.la source
in
tests sur desrange
objets.xrange
Cependant, je ne suis pas sûr de son efficacité sur Python 2 . ;)__contains__
peut trivialement calculer si une valeur est dans la plage ou non.range
instance à chaque fois. En utilisant une seule instance préexistante , le test "nombre entier dans la plage" est environ 40% plus rapide dans mes délais.La solution à dict.has_key () est déconseillée, utilisez 'in' - sublime text editor 3
Ici, j'ai pris un exemple de dictionnaire nommé «âges» -
la source
Développant les tests de performance d'Alex Martelli avec les commentaires d'Adam Parkin ...
la source
Si vous avez quelque chose comme ça:
changez-le ci-dessous pour fonctionner sur Python 3.X et supérieur:
la source
t.has_key(ew)
renvoieTrue
si laew
référence des valeurs est également une clé dans le dictionnaire.key not in t
renvoieTrue
si la valeur n'est pas dans le dictionnaire. De plus, l'key = ew
alias est très, très redondant. L'orthographe correcte estif ew in t
. C'est ce que la réponse acceptée de 8 ans auparavant vous a déjà dit.