Когда лучше использовать zip
вместо itertools.izip
?
Когда лучше использовать zip вместо izip?
Ответ 1
Когда вы знаете, что вам нужен полный список построенных элементов (например, для перехода к функции, которая будет изменять этот список на месте). Или когда вы хотите принудительно передать аргументы, которые вы передаете, в zip()
для полной оценки в этой конкретной точке.
Ответ 2
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
вычисляли пары all (a, b)
перед входом в цикл.
Более того, если lst_a
и lst_b
очень большие (например, миллионы записей), zip(a, b)
построит третий список с двойным пространством.
Но если у вас небольшие списки, возможно, zip
быстрее.
Ответ 3
В 2.x, когда вам нужен список вместо итератора.
Ответ 4
Библиотека itertools предоставляет "итераторы" для общих функций Python. Из документов itertools "Как zip(), за исключением того, что он возвращает итератор вместо списка". я в izip() означает "итератор".
Итераторы Python представляют собой "ленивую загруженную" последовательность, которая сохраняет память по регулярному списку в памяти. Таким образом, вы должны использовать itertools.izip(a, b), когда два входа a, b слишком велики, чтобы сохранить в памяти за один раз.
Посмотрите концепции Python, связанные с эффективной последовательной обработкой:
"generators" & "yield"
"iterators"
"lazy loading"