Python 生成器如何节省内存

Sol*_*xun 5 python generator

我理解一般的想法,即生成器返回一个“保存状态”的可迭代对象,并且不会立即计算所有内容,而是在每次调用时进行计算next。这是如何运作的?例如[x for x in range(10) if x%2==0]vs (x for x in range(10) if x%2==0)。在列表理解中,所有内容都会立即计算并存储在内存中。

在生成器中,不会生成整个列表,而是生成一个可迭代的生成器对象,该对象在每次调用 next 时进行计算。但这个生成器必须以某种方式知道它的“边界”,对吗?如果生成器没有在后台执行所有计算,它如何知道从哪里继续计算?我认为它必须知道列表理解中的每一步,最终如果您最终循环整个生成器直到达到 StopIteration,我认为您使用的内存量大致相同。

Cor*_*mer 1

但这个生成器必须以某种方式知道它的“边界”,对吗?

不,没有!它只是继续运输,直到到达StopIteration。它一次只处理内存中的一个元素,然后将其丢弃。