Don*_*Don 92

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
Run Code Online (Sandbox Code Playgroud)

因此,如果您需要一个列表(不是类似列表的对象),只需使用'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
Run Code Online (Sandbox Code Playgroud)

使用zip会在进入循环之前计算所有 (a, b)夫妻.

此外,如果lst_a并且lst_b非常大(例如数百万条记录),zip(a, b)将构建具有双倍空间的第三个列表.

但如果你有小名单,也许zip更快.

  • 你是对的.我从善意开始,然后陷入理论上...... (7认同)
  • 谢谢.然而,这主要回答什么时候``izip`比`zip`更好... (5认同)

Amb*_*ber 39

当你知道你想要构建的完整项目列表时(例如,传递给一个可以就地修改该列表的函数).或者,当您要强制传递的参数zip()在该特定点完全评估时.


Ign*_*ams 5

在2.x中,当您需要列表而不是迭代器时.

  • 并不是的.这就是为什么我倾向于选择`itertools.izip()`,除非收益纯粹是统计的. (3认同)
  • 当您需要列表时,一种情况是您计划按索引访问结果的项目或需要查找总长度.`lst = zip(lst_a,lst_b)`允许`lst [1]`或`len(lst)`.但是,对于`ilst = itertools.izip(lst_a,lst_n)`,你将无法尝试`ilst [1]`或`len(ilst)`. (2认同)

Sak*_*med 5

itertools库为常见的Python函数提供“迭代器”。从itertools文档中,“类似于zip(),但它返回的是迭代器而不是列表。” izip()中的I表示“迭代器”。

Python迭代器是一个“延迟加载”序列,可以在常规内存列表中节省内存。因此,当两个输入a,b太大而无法一次保存在内存中时,可以使用itertools.izip(a,b)。

查找与有效顺序处理相关的Python概念:

"generators" & "yield"
"iterators"
"lazy loading"
Run Code Online (Sandbox Code Playgroud)