什么时候使用zip而不是izip更好?


81

什么时候使用zip代替更好itertools.izip


支持的原因zip(太明显了,但仍然值得指出)是izip返回一个iterator只能被遍历一次的。即在ii = izip(a,b) ; f(ii) ; g(ii)这里,一个空列表[]被传递给g
因果关系

5
仅供参考,Python 3的zip功能是Python 2的功能izip。一般而言,Python 3更改了大多数函数以使用迭代器,例如范围,过滤器,字典函数等
Charles

Answers:


44

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


1
在第一种情况下使用izip会不会更好,因为它会重用元组,并且速度更快,因为没有真正的理由不使用izip?
user1815201 2013年

1
@ user1815201:izip仅重复使用tuple,如果tuple被释放的下一次迭代开始前,所以它不会获得你任何东西。话虽如此,任何损失也是微不足道的,因此我同意没有理由不izip单独使用,list如果需要的话请使用list; 实际上你可以通过添加这样做的“正确”的方式from future_builtins import zip来的Py2代码,这使得纯zipizip(准备PY3过渡)。
ShadowRanger 2015年

98

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_alst_b非常大(例如,数百万条记录),zip(a, b)将建立第三个具有双倍空格的列表。

但是,如果您的清单较小,则可能zip会更快。


9
你是对的。我一开始就怀着良好的意愿,然后又陷入了理论性的困境……

5

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


您能举个例子说明这种情况可能发生吗?
尼尔·G

3
并不是的。这就是为什么我倾向于选择itertools.izip()除纯统计上的收益以外的其他原因。
Ignacio Vazquez-Abrams'Feb

2
当需要列表时,一种情况是计划通过索引访问结果项或需要查找总长度。lst = zip(lst_a, lst_b)允许lst[1]len(lst)。但是,因为ilst = itertools.izip(lst_a, lst_n)您将无法尝试ilst[1]len(ilst)
2013年

5

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

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

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

"generators" & "yield"
"iterators"
"lazy loading"

很好解释。
拉胡尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.