¿Cuándo es mejor usar zip
en lugar de itertools.izip
?¿Cuándo es mejor usar zip en lugar de izip?
Respuesta
Cuando sabe, querrá la lista completa de elementos construidos (por ejemplo, para pasar a una función que modificaría esa lista in situ). O cuando desee forzar los argumentos que está pasando al zip()
para que sean evaluados completamente en ese punto específico.
¿No sería mejor usar izip en el primer caso ya que es más rápido ya que reutiliza la tupla y no hay una razón real para no usar izip? – user1815201
@ user1815201: 'izip' solo reutiliza' tuple' si la 'tuple' se lanzó antes de que comience la siguiente iteración, por lo que no gana nada. Dicho esto, cualquier pérdida es trivial también, así que estoy de acuerdo en que hay pocas razones para no usar 'izip' exclusivamente, envolviendo con' list' si necesitas una 'list'; en realidad puedes hacerlo de la manera "correcta" al agregar 'from future_builtins import zip' al código Py2, lo que hace que' zip' sea 'izip' (preparándote para la transición de Py3). – ShadowRanger
En 2.x, cuando necesita una lista en lugar de un iterador.
¿Puede darme un ejemplo de lo que podría pasar? –
No realmente. Por eso tiendo a preferir 'itertools.izip()' excepto donde las ganancias serían puramente estadísticas. –
Un caso, cuando necesita una lista, es cuando planea acceder a los elementos del resultado por índice o necesita encontrar la longitud total. 'lst = zip (lst_a, lst_b)' permite 'lst [1]' o 'len (lst)'. Sin embargo, para 'ilst = itertools.izip (lst_a, lst_n)' fallarás al intentar 'ilst [1] 'o' len (ilst) '. –
zip
calcula toda la lista a la vez, izip
calcula los elementos solo cuando se solicita.
Una diferencia importante es que 'zip' devuelve una lista real, 'IZIP' devuelve un 'objeto IZIP', que no es una lista y no es compatible con las características de lista específica (como la indexación):
>>> l1 = [1, 2, 3, 4, 5, 6]
>>> l2 = [2, 3, 4, 5, 6, 7]
>>> z = zip(l1, l2)
>>> iz = izip(l1, l2)
>>> isinstance(zip(l1, l2), list)
True
>>> isinstance(izip(l1, l2), list)
False
>>> z[::2] #Get odd places
[(1, 2), (3, 4), (5, 6)]
>>> iz[::2] #Same with izip
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'itertools.izip' object is unsubscriptable
Por lo tanto, si necesita una lista (no es un objeto similar a una lista), simplemente use 'zip'.
Aparte de esto, 'izip' puede ser útil para salvar la memoria o los ciclos.
E.g. el código siguiente puede salir después de algunos ciclos, lo que no hay necesidad de calcular todos los elementos de la lista combinada:
lst_a = ... #list with very large number of items
lst_b = ... #list with very large number of items
#At each cycle, the next couple is provided
for a, b in izip(lst_a, lst_b):
if a == b:
break
print a
usando zip
habría calculado todos(a, b)
parejas antes de entrar en el ciclo.
Además, si lst_a
y lst_b
son muy grandes (por ejemplo, millones de registros), zip(a, b)
creará una tercera lista con doble espacio.
Pero si tiene listas pequeñas, tal vez zip
es más rápido.
Gracias. Sin embargo, esto principalmente responde cuando es 'izip' mejor que' zip' ... –
Tienes razón. Empecé con buenas intenciones y luego caí en cosas teóricas ... – Don
La biblioteca itertools proporciona "iteradores" para las funciones comunes de Python. Desde los documentos itertools, "Like zip() excepto que devuelve un iterador en lugar de una lista". El I en izip() significa "iterador".
Los iteradores de Python son una secuencia "de carga lenta" que guarda la memoria sobre la lista en memoria normal. Entonces, usaría itertools.izip (a, b) cuando las dos entradas a, b son demasiado grandes para guardarlas en la memoria al mismo tiempo.
Busque los conceptos relacionados con Python eficiente procesamiento secuencial:
"generators" & "yield"
"iterators"
"lazy loading"
Bien explicado. –
- 1. Cuándo usar HttpApplicationState en lugar de Web.Caching.Cache?
- 2. ¿Cuándo es mejor usar un Struct en lugar de un Hash en Ruby?
- 3. Cuándo usar `static_assert` en lugar de SFINAE?
- 4. ¿Cuándo es correcto usar ViewData en lugar de ViewModels?
- 5. ¿Cuándo usar 'función' en lugar de 'diversión'?
- 6. Cuándo usar ImageButton en lugar de ImageView?
- 7. Cuándo usar atributos en lugar de propiedades?
- 8. ¿Cuándo es mejor usar la pila en lugar del montón y viceversa?
- 9. ¿Es siempre mejor usar 'DbContext' en lugar de 'ObjectContext'?
- 10. ¿Cómo sé cuál es el mejor lugar para usar 'usar'?
- 11. ¿Cuándo es mejor OOP?
- 12. ¿Cuándo debería usar __forceinline en lugar de inline?
- 13. Gradle buscando zip en lugar de jar
- 14. ¿Cuándo debo usar print en lugar de echo en PHP?
- 15. Inicialización uniforme en C++ 0x, cuándo usar() en lugar de {}?
- 16. ¿Cuándo debería usar NSURL en lugar de NSString y viceversa?
- 17. Cuándo usar Struct en lugar de Hash en Ruby?
- 18. ¿Cuándo es mejor no usar la unión interna?
- 19. ¿Cuándo debería usar un campo en lugar de una propiedad?
- 20. ¿Cuándo se debe usar Throwable en lugar de Excepción nueva?
- 21. Por qué/cuándo usar (!! p) en lugar de (p! = NULO)
- 22. ¿Cuándo debería usar string en lugar de stringstream?
- 23. ¿Cuándo debería usar una estructura en lugar de una clase?
- 24. Cuándo usar la delegación en lugar de la herencia?
- 25. ¿Cuándo debo usar un UserControl en lugar de una página?
- 26. Reenviar declaración/¿cuándo es mejor incluir encabezados?
- 27. ¿Cuándo debería usar el doble en lugar del decimal?
- 28. ¿Cuándo usar == y cuándo usarlo?
- 29. ¿Cuándo es preferible usar booleano volátil en Java en lugar de AtomicBoolean?
- 30. ¿Cuándo es apropiado usar CacheItemRemovedCallback?
Una de las razones en favor de 'zip', demasiado obvio y aún así vale la pena señalar, es que' 'devuelve un izip' iterator' que puede ser atravesado solo una vez es decir, en 'ii = izip (a, b); f (ii); g (ii) ', aquí una lista vacía' [] 'se pasa a' g'. – Causality