我了解生成器的一般概念,即生成器返回一个可迭代对象,可以“保存状态”,并不会立即计算所有内容,而是在每次调用
在生成器中,不会产生整个列表,而是产生一个可迭代的生成器对象,它将在每次调用next时计算。但是这个生成器必须知道它的“边界”,对吧?如果生成器不在后台执行所有计算,它怎么知道从哪里继续执行呢?我认为它必须知道列表推导式中的每一步,最终,如果您一直遍历生成器,直到遇到StopIteration,那么您使用的大致上是相同的内存量。
next
时计算。那么这是如何实现的呢?例如:[x for x in range(10) if x%2==0]
和(x for x in range(10) if x%2==0)
。在列表推导式中,所有内容都会一次性被计算并存储在内存中。在生成器中,不会产生整个列表,而是产生一个可迭代的生成器对象,它将在每次调用next时计算。但是这个生成器必须知道它的“边界”,对吧?如果生成器不在后台执行所有计算,它怎么知道从哪里继续执行呢?我认为它必须知道列表推导式中的每一步,最终,如果您一直遍历生成器,直到遇到StopIteration,那么您使用的大致上是相同的内存量。
range
会返回一个列表(至少在Python 2.x中)...基本上完全抵消了生成器的任何好处... - Joran Beasley