Me pregunto qué es mejor hacer:
d = {'a': 1, 'b': 2}
'a' in d
True
o:
d = {'a': 1, 'b': 2}
d.has_key('a')
True
python
dictionary
igorgue
fuente
fuente
keys()
es solo una vista de conjunto en un diccionario en lugar de una copia, también lox in d.keys()
es O (1). Aún así,x in d
es más pitónico.x in d.keys()
debe construir y destruir un objeto temporal, completo con la asignación de memoria que conlleva, dondex in d.keys()
solo está haciendo una operación aritmética (calculando el hash) y haciendo una búsqueda. Tenga en cuenta qued.keys()
solo es aproximadamente 10 veces más largo que esto, que todavía no es realmente largo. No lo he verificado, pero todavía estoy bastante seguro de que es solo O (1).in
gana sin dudas, no solo en elegancia (y no en desuso ;-) sino también en rendimiento, por ejemplo:Si bien la siguiente observación no siempre es cierta, notará que , por lo general , en Python, la solución más rápida es más elegante y pitónica; por eso
-mtimeit
es TAN útil: ¡no se trata solo de ahorrar cien nanosegundos aquí y allá!)fuente
has_key
parece ser O (1) también.Según los documentos de Python :
fuente
has_key()
ahora se elimina en Python 3Use
dict.has_key()
si (y solo si) se requiere que su código sea ejecutable por versiones de Python anteriores a la 2.3 (cuandokey in dict
se introdujo).fuente
Hay un ejemplo donde
in
realmente mata tu rendimiento.Si lo usa
in
en un contenedor O (1) que solo implementa__getitem__
yhas_key()
no__contains__
lo hará, convertirá una búsqueda O (1) en una búsqueda O (N) (ya quein
retrocede a una búsqueda lineal a través de__getitem__
).La solución es obviamente trivial:
fuente
has_key()
es específico de los diccionarios Python 2 .in
/__contains__
es la API correcta para usar; para aquellos contenedores en los que es inevitable una exploración completa, no hay ningúnhas_key()
método de todos modos , y si hay un enfoque O (1), entonces ese será el caso de uso específico y el desarrollador debe elegir el tipo de datos correcto para el problema.has_key
es un método de diccionario, peroin
funcionará en cualquier colección, e incluso cuando__contains__
falte,in
usará cualquier otro método para iterar la colección para averiguarlo.fuente
in
pruebas enrange
objetos. Sin embargo, no estoy tan seguro de su eficacia en Python 2xrange
. ;)__contains__
puede calcular trivialmente si un valor está en el rango o no.range
instancia cada vez. Usando una sola instancia preexistente, la prueba de "entero en el rango" es aproximadamente un 40% más rápida en mis tiempos.La solución a dict.has_key () está en desuso, use 'in' - sublime text editor 3
Aquí he tomado un ejemplo de diccionario llamado 'edades':
fuente
Ampliando las pruebas de rendimiento de Alex Martelli con los comentarios de Adam Parkin ...
fuente
Si tienes algo como esto:
cámbielo a continuación para ejecutarlo en Python 3.X y superior:
fuente
t.has_key(ew)
devuelveTrue
si el valor deew
referencia también es una clave en el diccionario.key not in t
devuelveTrue
si el valor no está en el diccionario. Además, elkey = ew
alias es muy, muy redundante. La ortografía correcta esif ew in t
. Que es lo que la respuesta aceptada de 8 años antes ya le dijo.