zip
computes all the list at once, izip
computes the elements only when requested.
One important difference is that 'zip' returns an actual list, 'izip' returns an 'izip object', which is not a list and does not support list-specific features (such as indexing):
>>> 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
So, if you need a list (an not a list-like object), just use 'zip'.
Apart from this, 'izip' can be useful for saving memory or cycles.
E.g. the following code may exit after few cycles, so there is no need to compute all items of combined list:
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
using zip
would have computed all (a, b)
couples before entering the cycle.
Moreover, if lst_a
and lst_b
are very large (e.g. millions of records), zip(a, b)
will build a third list with double space.
But if you have small lists, maybe zip
is faster.