说我们做了以下事情:(忽略如果这是愚蠢的,或者如果有更好的方法,这是一个简化的例子)
from itertools import izip
def check(someList):
for item in someList:
yield item[0]
for items in izip(check(someHugeList1), check(someHugeList2)):
//some logic
因为check是一个生成器,使用izip是多余的吗?使用普通拉链会一样好吗?
答案 0 :(得分:6)
常规zip()
会首先扩展整个生成器。你不希望用巨大的或无穷无尽的发电机做到这一点。
演示:
>>> def gen():
... print 'generating'
... yield 'a'
...
>>> gen()
<generator object gen at 0x10747f320>
>>> zip(gen(), gen())
generating
generating
[('a', 'a')]
请注意,直接创建生成器不会打印任何内容;发电机仍处于暂停状态。但是将生成器传递给zip()
会立即生成输出,只能通过完全迭代生成器来生成输出。
答案 1 :(得分:1)
在Python 3上,zip的行为与Python2的izip相同。在Python2上,izip返回一个生成器,而zip返回一个列表,izip在内存中会更好(不会创建新列表。)。