python无穷迭代器为什么内存不会不够

# -*- coding: UTF-8 -*-
def _odd_iter():
    n = 1
    while True:
        n = n + 2
        yield n
def _not_divisible(n):
    return lambda x: x % n > 0

def primes():
    yield 2
    it = _odd_iter() # 初始序列
    while True:
        n = next(it) # 返回序列的第一个数
        yield n
        it = filter(_not_divisible(n), it) # 构造新序列
        
# 打印1000以内的素数:
for n in primes():
    if n < 1000:
        print(n)
    else:
        break

我在学习python的时候遇到上面这么一段代码,可是令我不明白的是, it = filter(_not_divisible(n), it) 为什么代码中的这一行,在每次循环的过程中,构建这么一个新的迭代器,却不需要计算出所有可能的结果
对于我来说最大的疑惑是, it = filter(_not_divisible(n), it) 这里每一次循环都会变为一个新的迭代器,这个迭代器如何保证符合前面迭代器的条件呢

就好比你只是数数的话,那么只是费时间
除非你把数写下来,才会用光纸张。

按顺序执行,新的迭代器会覆盖旧的迭代器,或者说产生新的 旧的就被释放了..

迭代器比较重要的特点就是:惰性计算,延迟执行,按需加载。

你这里说的无穷迭代器,并不会提前将所有数据生成,而是每次 for n in primes() 循环调用 primes() 和 执行 next(it) 时,才会按需生成一个值。而在下次生成值的时候,有会覆盖上次的值。所以内存占用是固定的,而且非常的小。

【以下回答由 GPT 生成】

这段代码使用了一个无穷迭代器来处理过滤操作。对于无穷迭代器,它不会一次性地生成所有结果,而是在需要的时候计算,并且只计算当前所需的结果。因此,即使是在每次循环中构建一个新的迭代器,也不会占用过多的内存。

具体来说,这段代码中的filter函数接受一个函数和一个迭代器作为参数,返回一个新的迭代器,该迭代器包含满足函数条件的元素。在每次循环中,filter函数会调用传递给它的函数,检查当前元素是否满足条件。

对于这个例子中的filter(_not_divisible(n), it)_not_divisible(n)是一个函数,用于检查迭代器it中的元素是否不能被n整除。在每次循环中,filter函数会使用_not_divisible(n)函数来过滤掉不符合条件的元素,并返回一个新的迭代器。这个新的迭代器只包含满足条件的元素,这样就避免了生成所有可能的结果。

因为无穷迭代器只计算当前所需的结果,并且不会一次性地生成全部结果,所以它的内存占用量非常小。此外,Python解释器还会对内存进行优化,可以及时回收不再使用的内存资源,进一步减少内存的占用。

总结起来,这段代码中的无穷迭代器只在需要的时候计算当前所需的结果,不会一次性生成全部结果,因此不会占用过多的内存。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^