Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python生成器如何节省内存_Python_Generator - Fatal编程技术网

Python生成器如何节省内存

Python生成器如何节省内存,python,generator,Python,Generator,我理解生成器返回一个“保存状态”的iterable的一般想法,它不会一次计算所有内容,而是通过每次调用next进行计算。这是怎么回事?例如[x代表范围(10)内的x,如果x%2==0]与(x代表范围(10)内的x,如果x%2==0)。在列表理解中,所有内容都会立即计算并存储在内存中 在生成器中,不会生成整个列表,而是生成一个iterable generator对象,该对象在每次调用next时进行计算。但是这个生成器一定知道它的“边界”,对吗?如果生成器不在后台执行所有计算,那么它如何知道从何处开

我理解生成器返回一个“保存状态”的iterable的一般想法,它不会一次计算所有内容,而是通过每次调用
next
进行计算。这是怎么回事?例如
[x代表范围(10)内的x,如果x%2==0]
(x代表范围(10)内的x,如果x%2==0)
。在列表理解中,所有内容都会立即计算并存储在内存中

在生成器中,不会生成整个列表,而是生成一个iterable generator对象,该对象在每次调用next时进行计算。但是这个生成器一定知道它的“边界”,对吗?如果生成器不在后台执行所有计算,那么它如何知道从何处开始计算?我认为它必须知道列表理解中的每一步,最终如果你在整个生成器中循环,直到停止迭代,我认为你使用的内存量大致相同

但是这个生成器一定知道它的“边界”,对吗


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

Heh,@thefourtheye,实际上,我正要将相同的信息重新转换成稍微不同的形式。但是另一个答案确实包含了足够的信息来回答这个问题。
range
将返回一个列表(至少在python2x中)。。。基本上完全消除了生成器带来的任何好处…@JoranBeasley:让我们慈善地假设OP使用的是python3.x,然后:-)是的,是的,足够公平:PI将审查上面建议的副本(我确实尝试过在手前搜索),但这基本上是我不理解的。为了一次只处理一个项目,它必须知道它所处的iterable对象的顺序,那么如果它丢弃了前面的每个元素,它怎么知道呢?换句话说,它如何知道next已经被多次调用“x”,并且它现在需要在“第三次”执行计算,例如,如果它没有保存计算的累积计数(因此我认为在StopIteration被调用时消除内存优势),请尝试进行读取。每次需要元素时,生成器都会继续调用
next
,直到遇到
StopIteration
。他们不知道,也不可能知道
StopIteration
将在哪里发生,直到他们到达那里。