2009-06-07 80 views
9

只看Python生成器,真正留下他們的印象,但有沒有什麼東西不使用它們?我在考慮從文件讀取過去的C編碼,或者用戶操作是區域。例如,生成器是否可以用來提示用戶輸入(基本數據輸入?)和輸入的調用函數過程?是否有任何性能或清理問題需要關注?Python生成器 - 什麼不使用它

回答

12

一個與發電機的問題是,他們得到的 「消費」。這意味着如果您需要再次遍歷序​​列,則需要再次創建生成器。

如果懶惰評估是一個問題,那麼你可能不想要一個生成器表達式。例如,如果您想預先執行所有計算(例如,以便您可以釋放資源),那麼列表理解或for循環可能是最好的。

如果您使用psyco,則列表表達式和循環會顯着提高速度,但對於生成器則不會。

此外相當明顯,如果您需要事先獲得序列的長度,那麼您不需要生成器。

13

發電機不能很好地保持。

通常,您會遇到一個錯誤,試圖保留一個生成器對象。

>>> def generatorForEvenKeys(aDictionary): 
    for k in aDictionary: 
     if k % 2 == 0: yield aDictionary[k] 

>>> x = generatorForEvenKeys(someDictionary) 
>>> pickle.dump(x,file('temp.dat','wb')) 

獲取您出現以下錯誤:

TypeError: can't pickle generator objects 
+0

+1好知道 – ebo 2009-06-07 13:15:39

1

當你想擁有的東西是iterateable,未持有在內存中的整個列表(這就是爲什麼xrange支持更長的時間序列比在Python 2.x的range,下)

當你需要你用一臺發電機爲了將整個「要輸出的東西列表」加載到內存中,使用生成器沒有太多意義 - 您可以直接返回一個列表。

對於(稍微)例如:

def my_pointless_generator(x): 
    thedata = range(x) # or thedata = list(range(x)) in Python 3.x 
    for x in thedata: 
     yield x 

..can只是儘可能有效地重寫..

def my_pointless_generator(x): 
    return range(x) 
相關問題