当前位置:  开发笔记 > 编程语言 > 正文

收益慢于回报.为什么?

如何解决《收益慢于回报.为什么?》经验,为你挑选了1个好方法。

我写了两个具有相同功能的函数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

Steve Barnes.. 7

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

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

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

因此,每次操作的产量稍微贵一些,但是在不用尽结果的情况下更加可靠且通常更快.



1> Steve Barnes..:

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

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

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

因此,每次操作的产量稍微贵一些,但是在不用尽结果的情况下更加可靠且通常更快.

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有