<p>我可以确认带有<code>list</code>示例的生成器更快:</p>
<pre><code>In [4]: def num_squared_iterator(nums):
...: for i in nums:
...: yield i**2
...:
...: def get_num_squared_list(nums):
...: l = []
...: for i in nums:
...: l.append(i**2)
...: return l
...:
In [5]: %timeit list(num_squared_iterator(nums))
320 µs ± 4.57 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [6]: %timeit get_num_squared_list(nums)
370 µs ± 25.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [7]: nums = range(100000)
In [8]: %timeit list(num_squared_iterator(nums))
33.2 ms ± 461 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [9]: %timeit get_num_squared_list(nums)
36.3 ms ± 375 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
</code></pre>
<p>然而,还有更多的故事。传统观点认为,生成器比迭代其他类型的iterables要慢,因此生成器的开销很大。但是,使用<code>list</code>会将列表构建代码向下推到C级,所以您看到了一种中间立场。注意,使用for循环可以优化如下:</p>
<pre><code>In [10]: def get_num_squared_list_microoptimized(nums):
...: l = []
...: append = l.append
...: for i in nums:
...: append(i**2)
...: return l
...:
In [11]: %timeit list(num_squared_iterator(nums))
33.4 ms ± 427 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [12]: %timeit get_num_squared_list(nums)
36.5 ms ± 624 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [13]: %timeit get_num_squared_list_microoptimized(nums)
33.3 ms ± 487 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
</code></pre>
<p>现在您看到,如果您“内联”<code>l.append</code>(这是<code>list</code>构造函数所避免的),方法中的许多差异都可以得到改善。一般来说,Python中的方法解析速度很慢。在紧密循环中,上面的微优化是众所周知的,并且是使for循环更高效的第一步。你知道吗</p>