【问题标题】:Redundant use of generators? (Python)冗余使用发电机? (Python)
【发布时间】:2014-01-28 07:47:33
【问题描述】:

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

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 是不是多余?使用普通的 zip 也一样好吗?

【问题讨论】:

    标签: python python-2.7 iterator generator


    【解决方案1】:

    Regular zip() 将首先扩展整个生成器。你不会想用一个巨大的或无穷无尽的生成器来做到这一点。

    演示:

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

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

    【讨论】:

    • 啊,就这么说吧,list(), or tuple()
    【解决方案2】:

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

    【讨论】:

    • 我的意思是内置 zip 的行为与 Python2 的 izip 相同。修正了措辞,谢谢。
    • @EdgarAroutiounian:第二句话直接相关。如果您继续使用 Python 3(它是一种比 Python 2 更好的语言),那么第一个也是如此。
    • @TimPietzcker 无意引发争议,只是一遍又一遍地听到人们应该迁移到 Python3 只是不再削减它了。许多人不能简单地移动到 3 并且对于许多 3 是失败的。 robg3d.com/?p=1175lucumr.pocoo.org/2014/1/5/unicode-in-2-and-3alexgaynor.net/2013/dec/30/about-python-3
    • @EdgarAroutiounian:感谢您提供这些有趣的链接!我仍然认为 Py3k 要好得多,但我也看到许多人很难过渡。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 2011-06-16
    • 1970-01-01
    • 2019-01-07
    • 2011-10-13
    • 1970-01-01
    相关资源
    最近更新 更多