产量低于 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 上的答案。
我写了两个功能相同的函数 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 上的答案。