2015-04-25 19 views
1

我回顧了Difference between function and generator?這個問題,但它被標記爲重複。所以我在這裏發佈我的答案版本。功能和發生器之間的區別?

原來的問題是:

我找的正常功能和發電機之間的確切差異。我已經用Google搜索了它。但所有的結果都相當混亂。我是初學者,所以我期待一些簡短而精確的例子。我試過What is the difference between normal function and generator function?但沒有用。

我已經經歷了這個What does the "yield" keyword do in Python?,但它純粹談論發電機,沒有什麼關於功能和發電機之間的區別。我需要一些幫助?

回答

2

原則上,生成器對於其懶惰評估而言是高效的內存。

A 生成器與返回數組的函數非常相似,因爲生成器具有參數,可以調用它並生成一系列值。但是,並不是構建包含所有值的數組,而是一次返回全部值,而不是一次一個值地生成一個值,這需要較少的內存,並允許調用者立即開始處理前幾個值。

簡而言之,發電機看起來像一個function但行爲像iterator

from itertools import count 

itertools提供count,以產生整數的無限流。您可以給出開始和步驟,告訴生成的流的開始和步進值。我將在下面的例子中使用它。

for i in count(start=0, step=1):  
    print i 

生成偶數列表的簡單示例。

生成並返回一個列表:

def find_even_number_function(number_stream): 
    even_number = [] 
    for n in number_stream: 
     if n % 2 == 0: 
      even_number.append(n) 
    return even_number 

for i in find_even_number_function(count()): 
    print i 

的代碼非常簡單明瞭,但其在內存中構建完整列表。這在我們的例子中顯然是不可接受的,因爲我們無法承擔所有無限的整數。正如你所看到的,這個功能永遠不會停止。在這種情況下,我們將使用發生器。

甲發生器yields項而不是返回列表

def find_even_number_generator(number_stream): 
    for n in number_stream: 
     if n % 2 == 0: 
      yield n 

for i in find_even_number_generator(count()): 
    print i 

注意,數生成邏輯的表達是清晰自然。它與在內存中構建列表的實現非常相似,但具有迭代器實現的內存使用特性。

使用生成器的性能改進是由於生成值的延遲(按需)生成的,這意味着較低的內存使用量。此外,在開始使用它們之前,我們不需要等到所有元素都已生成。這與迭代器提供的好處類似,但生成器使構建迭代器變得容易。

因此,簡而言之,如果對上述情況使用正常功能,則會導致內存不足。或者,如果您使用發電機功能,則將耗盡時間。

相關問題