什么时候使用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_a
和lst_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"