收益慢于回报。为什么呢?

时间:2017-01-16 07:00:01

标签: python yield

我写了两个具有相同功能的函数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 shuold会更快,但在运行时g会更快

时间g

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

时间为f

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

2 个答案:

答案 0 :(得分:6)

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

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

产量结果只消耗足够的内存来保存发生器并在任何时刻产生单个结果 - 完整的计算会消耗足够的内存来同时保存所有结果。当你得到非常大的数据集时,无论大小和崩溃的东西都会产生差异。

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

答案 1 :(得分:0)

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

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

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