¿Cuándo es mejor usar zip en lugar de izip?

¿Cuándo es mejor usar zip lugar de itertools.izip ?

Cuando sepa que querrá que se construya la lista completa de elementos (por ejemplo, para pasar a una función que modificaría esa lista en el lugar). O cuando quiera forzar los argumentos que está pasando a zip() para que se evalúen completamente en ese punto específico.

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 admite funciones específicas de la lista (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 "", line 1, in  TypeError: 'itertools.izip' object is unsubscriptable 

Por lo tanto, si necesita una lista (y no un objeto similar a una lista), simplemente use ‘zip’.

Aparte de esto, ‘izip’ puede ser útil para guardar memoria o ciclos.

Por ejemplo, el siguiente código puede salir después de algunos ciclos, por lo que no es necesario 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 

el uso de zip habría computado todas las parejas (a, b) antes de ingresar al 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 tienes listas pequeñas, quizás zip sea ​​más rápido.

En 2.x, cuando necesitas una lista en lugar de un iterador.

La biblioteca de itertools proporciona “iteradores” para las funciones comunes de Python. De los documentos de itertools, “Me gusta zip () excepto que devuelve un iterador en lugar de una lista”. El I en izip () significa “iterador”.

Los iteradores de Python son una secuencia “cargada de forma perezosa” que ahorra memoria en la lista normal de la memoria. 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 de Python relacionados con el procesamiento secuencial eficiente:

 "generators" & "yield" "iterators" "lazy loading"