何时使用zip
代替itertools.izip
更好?
答案 0 :(得分:90)
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'对于节省内存或循环非常有用。
E.g。以下代码可能在几个周期后退出,因此无需计算组合列表的所有项目:
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
非常大(例如数百万条记录),则zip(a, b)
将构建具有双倍空格的第三个列表。
但是如果你有小名单,那么zip
可能会更快。
答案 1 :(得分:39)
当您知道自己需要构建的完整项目列表时(例如,传递给可以就地修改该列表的函数)。或者,当您要强制传递给zip()
的参数时,要在该特定点进行完全评估。
答案 2 :(得分:5)
在2.x中,当你需要列表而不是迭代器时。
答案 3 :(得分:4)
itertools库为常见的Python函数提供了“迭代器”。来自itertools文档,“喜欢zip(),除了它返回迭代器而不是列表。” i in izip()的意思是“迭代器”。
Python迭代器是一个“延迟加载”序列,可以将内存保存在常规内存列表中。所以,当两个输入a,b太大而无法一次保留在内存中时,你会使用itertools.izip(a,b)。
查找与高效顺序处理相关的Python概念:
"generators" & "yield"
"iterators"
"lazy loading"