Kit*_*Kit 16 python performance yield return generator
我目前正处于个人学习项目中,我在XML数据库中阅读.我发现自己正在编写收集数据的函数,我不确定什么是快速返回它们的方法.
这通常更快:
yields,或 append()在功能中的几个s然后return随后list?我很高兴知道在什么情况下yields会比append()s 快,反之亦然.
Joc*_*zel 18
yield懒惰和速度的巨大优势通常不是使用它的最佳理由.但如果它适用于您的上下文,那么没有理由不使用它:
# yield_vs_append.py
data = range(1000)
def yielding():
def yielder():
for d in data:
yield d
return list(yielder())
def appending():
lst = []
for d in data:
lst.append(d)
return lst
Run Code Online (Sandbox Code Playgroud)
这是结果:
python2.7 -m timeit -s "from yield_vs_append import yielding,appending" "yielding()"
10000 loops, best of 3: 80.1 usec per loop
python2.7 -m timeit -s "from yield_vs_append import yielding,appending" "appending()"
10000 loops, best of 3: 130 usec per loop
Run Code Online (Sandbox Code Playgroud)
至少在这个非常简单的测试中,yield比追加更快.
我最近问自己一个类似的问题,探索通过附加到列表或通过生成器生成列表(或元组)的所有排列的方法,并找到(对于长度为9的排列,大约需要一秒钟左右生成) :
itertools.permutationsyield)减少大约.20%itertools.permutations.带上一粒盐!时间和分析非常有用:
if __name__ == '__main__':
import cProfile
cProfile.run("main()")
Run Code Online (Sandbox Code Playgroud)
有更快的替代TH4Ck的屈服().这是列表理解.
In [245]: def list_comp():
.....: return [d for d in data]
.....:
In [246]: timeit yielding()
10000 loops, best of 3: 89 us per loop
In [247]: timeit list_comp()
10000 loops, best of 3: 63.4 us per loop
Run Code Online (Sandbox Code Playgroud)
当然,在不知道代码结构的情况下对这些操作进行微基准测试是相当愚蠢的.他们每个人在差异情况下都很有用.例如,如果要应用可以表达为单个表达式的简单操作,则列表理解很有用.Yield有一个显着的优势,您可以将遍历代码隔离到生成器方法中.哪一个适当取决于使用情况.