擅长:python、mysql、java
<p>将生成器视为一个惰性序列,它通常比相应的渴望序列的时间效率低</p>
<pre class="lang-py prettyprint-override"><code>%timeit sum((x*2 for x in range(5000))) # lazy generator
366 µs ± 9.24 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit sum([x*2 for x in range(5000)]) # eager list
308 µs ± 3.12 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
</code></pre>
<p>这是因为生成器保持中间状态,每个项都必须恢复中间状态。相反,急切地创建序列只需处理一次中间状态</p>
<p>但是请记住,发电机的开销基本上是固定的。如果每个项目都需要很长时间来计算,则生成器的恒定开销可以忽略不计。当一次处理一个项目时,s还允许释放已处理的项目,从而减少流程上的总体负载——可能在某个时候达到净时间优势</p>
<hr/>
<p>生成器的优点是,懒散性允许表示<em>无限</em>序列和<em>延迟</em>–与序列“普通O(ni)”相比,生成器是“n倍O(i)”。这允许生成器以可靠的时间效率生成<em>每个</em>项,即使整个过程会无限延迟</p>
<p>一个无限的,<em>急切的</em>序列将具有无限的时间复杂度,但一个无限的,<em>懒惰的</em>生成器只根据需要生成项</p>
<pre class="lang-py prettyprint-override"><code>def randoms():
"""Infinite stream of random numbers"""
while True:
yield random.random()
</code></pre>
<p>同样,生成器允许<em>外部数据源</em>提供每个项目之间的时间间隔。当数据源在提供项目之间有明显的延迟时,这可以使生成器更高效</p>