"元素"存储在生成器中的哪个位置?

DDR*_*Rpy 4 python generator language-concepts

以下代码汇总了all_numbers中列表中的所有数字.这是有道理的,因为要汇总的所有数字都保存在列表中.

def firstn(n):
    '''Returns list number range from 0 to n '''
    num, nums = 0, []
    while num < n:
        nums.append(num)
        num += 1
    return nums

# all numbers are held in a list which is memory intensive
all_numbers = firstn(100000000)
sum_of_first_n = sum(all_numbers)

# Uses 3.8Gb during processing and 1.9Gb to store variables
# 13.9 seconds to process
sum_of_first_n 
Run Code Online (Sandbox Code Playgroud)

将上述函数转换为生成函数时,我发现使用较少的内存(代码下方)得到的结果相同.我不明白的是,如果all_numbers不包含上面列表中的所有数字,它们如何进行汇总?

如果数字是按需生成的,那么就可以生成所有数字以将它们全部汇总在一起,那么这些数字存储在哪里以及这如何转化为减少内存使用量?

def firstn(n):
    num = 0
    while num < n:
        yield num
        num += 1

# all numbers are held in a generator
all_numbers = firstn(100000000)
sum_of_first_n = sum(all_numbers)

# Uses < 100Mb during processing and to store variables
# 9.4 seconds to process
sum_of_first_n
Run Code Online (Sandbox Code Playgroud)

我理解如何创建生成器函数以及为什么要使用它们但我不明白它们是如何工作的.

Net*_*ave 5

A generator不存储值,您需要将生成器视为具有上下文的函数,它会GENERATE在每次要求时保存状态和值,因此,它会为您提供一个值,然后"丢弃"它,掌握计算的背景,等到你要求更多; 而将这样做,直到产生背景被耗尽.

def firstn(n):
    num = 0
    while num < n:
        yield num
        num += 1
Run Code Online (Sandbox Code Playgroud)

在你提供的这个例子中,所使用的"唯一"存储器num是存储计算的地方,firstn生成器保持num在其context till thewhile循环中.