以下代碼總結了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
我知道如何創建一個生成器功能,你爲什麼會想使用它們,但我不知道他們是如何工作的。
您可能需要產生所有的數字...但你**不必將其全部保存在一次**,喜歡你的第一種方法 – donkopotamus
他們不存儲。參見[David Beazley關於發電機的介紹](http://www.dabeaz.com/generators/)。正如其他人所說,他們不存儲在任何地方。[pdf](http://www.dabeaz.com/generators/Generators.pdf) –
正如其他人所說,他們不存儲在任何地方。這是發電機的全部重點。通常你需要依次查看很多值,但是在任何時候都不需要記憶中的所有值。 – timgeb