下面的代码总结了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
将上述函数转换为生成器函数时,我发现使用更少的内存得到了相同的结果(下面的代码)。我不明白的是,如果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
我了解如何创建生成器函数以及为什么要使用它们,但我不明白它们是如何工作的。