发电机的冗余使用?(Python)

2024-04-18 08:52:26 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我们做了以下事情:(忽略这是否愚蠢或者有更好的方法,这是一个简化的例子)

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是多余的吗?使用普通拉链也一样好吗?你知道吗


Tags: 方法infromimportfordefcheckitems
2条回答

在python3上,zip的行为与Python2的izip相同。在Python2上,izip返回一个生成器,而zip返回一个列表,izip在内存中会更好(不会创建新的列表)。你知道吗

规则的zip()会首先扩展整个生成器。你不会想用一个巨大的或无休止的发电机。你知道吗

演示:

>>> def gen():
...     print 'generating'
...     yield 'a'
... 
>>> gen()
<generator object gen at 0x10747f320>
>>> zip(gen(), gen())
generating
generating
[('a', 'a')]

请注意,直接创建生成器不会打印任何内容;生成器仍处于暂停状态。但是将生成器传递给zip()会立即生成输出,而输出只能通过对生成器进行完全迭代来生成。你知道吗

相关问题 更多 >