it-swarm-ru.tech

Когда лучше использовать Zip вместо izip?

Когда лучше использовать Zip вместо itertools.izip ?

72
Neil G

Когда вы знаете, что вам нужен полный список элементов (например, для передачи функции, которая будет изменять этот список на месте). Или когда вы хотите, чтобы аргументы, которые вы передаете Zip(), были полностью оценены в данный момент.

39
Amber

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 быстрее.

91
Dona

В 2.x, когда вы нужен список вместо итератора.

5
Ignacio Vazquez-Abrams

Библиотека itertools предоставляет "итераторы" для общих функций Python. Из документов itertools: "Как Zip (), за исключением того, что он возвращает итератор вместо списка". I в izip () означает "итератор".

Итераторы Python - это "лениво загруженная" последовательность, которая экономит память по обычному списку в памяти. Таким образом, вы должны использовать itertools.izip (a, b), когда два входа a, b слишком велики для одновременного хранения в памяти.

Посмотрите на понятия Python, связанные с эффективной последовательной обработкой:

"generators" & "yield"
"iterators"
"lazy loading"
4
Sakib Ahammed