Python 3.6.8 (default, Oct 7 2019, 12:59:55)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.9.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: def yield_from_generator():
...: yield from (i for i in range(10000))
...:
In [2]: def yield_from_list():
...: yield from [i for i in range(10000)]
...:
In [3]: import timeit
In [4]: timeit.timeit(lambda: list(yield_from_generator()), number=10000)
Out[4]: 5.3820097140014695
In [5]: timeit.timeit(lambda: list(yield_from_list()), number=10000)
Out[5]: 4.333915593000711
我多次运行了yield from
生成器和yield from
列表。总是发现列表版本具有更好的性能,而我的直觉告诉我相反的结论 - 制作列表需要在启动时进行内存分配。为什么我们会注意到这种性能差异?
next()
(并潜在地抛出StopIteration
)可能会很昂贵。 - DeepSpaceyield from
与普通的return
基本上给出了相同的结果,因此它并不相关。这个问题似乎是这个问题的重复:https://dev59.com/WWct5IYBdhLWcg3wmOng。 - ekhumoroyield from
不在Python 2中存在以外,Python 3中的列表推导式略有不同:它们现在会创建自己的作用域,但是如果我没记错的话,一些改进已经被实现,使得它们拥有自己的作用域对速度没有太大影响。因此,我不确定是否应该将这个问题关闭为Python 2的重复。 - PM 2Ring