zip
вычисляет весь список одновременно, izip
вычисляет элементы только по запросу.
Одно важное отличие состоит в том, что «zip» возвращает фактический список, «izip» возвращает «объект izip», который не является списком и не поддерживает функции, специфичные для списка (например, индексирование):
>>> 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
Итак, если вам нужен список (не похожий на список объект), просто используйте zip.
Помимо этого, izip может быть полезен для экономии памяти или циклов.
например. следующий код может завершиться через несколько циклов, поэтому нет необходимости вычислять все элементы объединенного списка:
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
с использованием zip
вычислило бы все (a, b)
пар перед началом цикла.
Более того, если lst_a
и lst_b
очень велики (например, миллионы записей), zip(a, b)
создаст третий список с двойным пробелом.
Но если у вас есть небольшие списки, возможно, zip
быстрее.