产量低于 return。为什么?

yield slower than return. why?

我写了两个功能相同的函数 f 和 g

def f(l, count):
    if count > 1:
        for i in f(l, count-1):
            yield i + 1
    else:

        yield from l

for i in f(range(100000),900):
    pass
print('f')

def g(l, count):
    if count > 1:
        tmp = []
        for i in g(l, count-1):
            tmp.append(i+1)
        return tmp
    else:
        return l
for i in g(range(100000),900):
    pass
print('f')

和我 我认为 f 应该更快但是 g 在 运行 it

时更快

g 时间

real    0m5.977s
user    0m5.956s
sys     0m0.020s

f

时间
real    0m7.389s
user    0m7.376s
sys     0m0.012s

产生结果的解决方案与计算完整结果的解决方案之间存在一些重大差异。

yield 不断返回下一个结果,直到耗尽,而完整的计算总是完全完成,所以如果你有一个可能提前终止计算的测试,(通常是这种情况),yield 方法只会被调用足够的次数满足该标准 - 这通常会导致更快的代码。

yield 结果只消耗足够的内存来保存生成器和任何时刻的单个结果 - 完整计算消耗足够的内存来一次保存所有结果。当您获得非常大的数据集时,无论大小如何运行的数据集和崩溃的数据集都会有所不同。

因此,每次操作的产量稍微贵一些,但在您没有穷尽结果的情况下更可靠且通常更快。

我不知道你的 h 和 g 函数在做什么,但请记住这一点,

Yield 是一个像 return 一样使用的关键字,除了该函数将 return 一个 generator这就是需要时间的原因。

关于 yield 的作用有一个很好的解释。检查 this Whosebug 上的答案。