Когда лучше использовать zip вместо izip? - PullRequest
72 голосов
/ 14 февраля 2011

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

Ответы [ 4 ]

91 голосов
/ 14 февраля 2011

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

39 голосов
/ 14 февраля 2011

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

5 голосов
/ 14 февраля 2011

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

4 голосов
/ 15 апреля 2015

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

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

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

"generators" & "yield"
"iterators"
"lazy loading"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...