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

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

当你知道你会想要完整的项目列表(例如,传递给一个函数,将就地修改该列表)。 或者当你想强制传递给zip()的参数在这个特定的点上被完全评估。

zip一次计算所有列表, izip仅在请求时计算元素。

一个重要的区别是,'zip'返回一个实际的列表,'izip'返回一个'izip对象',它不是一个列表,不支持列表特定的function(如索引):

 >>> 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非常大(例如数百万条logging),则zip(a, b)将构build第二个具有双倍空间的列表。

但是,如果你有小列表,也许zip更快。

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

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

Python迭代器是一个“延迟加载”序列,可以将内存保存在常规内存列表中。 所以,当两个inputa,b太大而不能一次保存在内存中时,你会使用itertools.izip(a,b)。

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

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