84

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

4

4 回答 4

101

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

usingzip会在进入循环之前计算所有对。 (a, b)

此外,如果lst_alst_b非常大(例如数百万条记录),zip(a, b)将构建第三个列表,其中包含双倍空间。

但是,如果您的列表很小,也许zip会更快。

于 2011-02-14T07:52:45.540 回答
44

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

于 2011-02-14T07:34:12.887 回答
7

itertools 库为常见的 Python 函数提供了“迭代器”。来自 itertools 文档,“像 zip() 只是它返回一个迭代器而不是一个列表。” izip() 中的 I 表示“迭代器”。

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

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

"generators" & "yield"
"iterators"
"lazy loading"
于 2015-04-15T08:53:31.273 回答
5

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

于 2011-02-14T07:33:58.660 回答