Je me demande ce qui est le mieux à faire:
d = {'a': 1, 'b': 2}
'a' in d
True
ou:
d = {'a': 1, 'b': 2}
d.has_key('a')
True
Je me demande ce qui est le mieux à faire:
d = {'a': 1, 'b': 2}
'a' in d
True
ou:
d = {'a': 1, 'b': 2}
d.has_key('a')
True
in
est nettement plus pythonic.
En fait, has_key()
a été supprimé en Python 3.x.
in
gagne haut la main, et pas seulement dans l'élégance (et de ne pas être obsolète;-) mais aussi dans la performance, par exemple:
$ python -mtimeit -s'd=dict.fromkeys(range(99))' '12 in d'
10000000 loops, best of 3: 0.0983 usec per loop
$ python -mtimeit -s'd=dict.fromkeys(range(99))' 'd.has_key(12)'
1000000 loops, best of 3: 0.21 usec per loop
Alors que la suite de l'observation n'est pas toujours vrai, vous remarquerez que d'habitude, en Python, le plus rapide de la solution est plus élégante et Pythonic; c'est pourquoi, -mtimeit
est DONC utile, et pas seulement à propos de l'enregistrement d'une centaine de nanosecondes ici et là!-)
Selon python docs:
has_key()
est dépréciée en faveur dekey in d
.
Il y a un exemple où l' in
fait tue votre performance.
Si vous utilisez in
sur un O(1) conteneur qui n'implémente __getitem__
et has_key()
mais pas __contains__
vous tournez un O(1) recherche en O(N) de recherche ( in
revient à une recherche linéaire via __getitem__
).
Correctif est évidemment trivial:
def __contains__(self, x):
return self.has_key(x)
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.