【问题标题】:Write a generator or return a generator?写一个生成器还是返回一个生成器?
【发布时间】:2014-01-02 16:48:02
【问题描述】:

在容器类中,当我想要迭代它的项目(或它的项目的转换,或它的项目的子集)时,我可以编写一个生成器(如f)或返回一个生成器(如g):

class SomeContainer:
    def __init__(self):
        self.data = [1, 'two', 3, 'four']

    def f(self):
        for e in self.data: yield e + e

    def g(self):
        return (e + e for e in self.data)

sc = SomeContainer()
for x in sc.f(): print(x)
for x in sc.g(): print(x)

我不需要通过send 将信息传递到生成器。

显然两种方式的行为相同(表面上)。

  1. 哪种方法更可取,为什么?

  2. 哪种方法产生的更少 开销或其他我没有发现的优势?

【问题讨论】:

    标签: python python-3.x generator python-internals


    【解决方案1】:

    生成器解析(例如在g() 中)会稍微快一些。

    如果您的逻辑变得比您提供的简单示例更复杂,那么显式循环(例如在f() 中)可能会更具可读性。

    除此之外,我想不出任何实质性差异。

    但请记住他们说的话:

    过早的优化是万恶之源!

    【讨论】:

    • 实际上在这种情况下生成器的理解速度较慢。 0.634 使用 f() 和 0.753 使用 g()
    • g() 等价于def h(self): return self.f(),所以它不应该比单纯的f() 快。虽然这取决于生成器表达式的实现方式。
    猜你喜欢
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 2019-11-05
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 2018-12-13
    相关资源
    最近更新 更多