我写了两个具有相同功能的函数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方法只会调用足够的次数来满足该标准 - 这通常会导致更快的代码.
产量结果只消耗足够的内存来保存发生器并在任何时刻产生单个结果 - 完整的计算会消耗足够的内存来同时保存所有结果.当你得到非常大的数据集时,无论大小和崩溃的东西如何运行都会产生差异.
因此,每次操作的产量稍微贵一些,但是在不用尽结果的情况下更加可靠且通常更快.
产生结果的解决方案与计算完整结果的解决方案之间存在一些巨大差异.
产量不断返回下一个结果直到耗尽,而完全计算总是完全完成,所以如果你有一个可能提前终止计算的测试(通常是这种情况),yield方法只会调用足够的次数来满足该标准 - 这通常会导致更快的代码.
产量结果只消耗足够的内存来保存发生器并在任何时刻产生单个结果 - 完整的计算会消耗足够的内存来同时保存所有结果.当你得到非常大的数据集时,无论大小和崩溃的东西如何运行都会产生差异.
因此,每次操作的产量稍微贵一些,但是在不用尽结果的情况下更加可靠且通常更快.