2016-09-28 83 views
0
def numbers(mi, ma): 
    return [n for n in range(mi, ma + 1)] 

def gen(xs): 
    return (x for x in xs) 

example = gen(numbers(10, 20)) 

在這個例子中,gen可以提高numbers的迭代性能嗎?爲什麼不)?生成列表可以提高Python的性能嗎?

def numbersGen(mi, ma): 
    return gen([n for n in range(mi, ma + 1)]) # Generator from list comprehension? 

Python能像Haskell一樣懶惰嗎?

+1

Python不能像'Haskell'一樣懶,因爲它的運行原理是不同的。在顯示的代碼中,該列表是在*從數字返回之前創建的*它是用生成器包裝的返回列表。這同樣適用於「直接」形式。如果生成器在迭代過程中比迭代更快,我會非常懷疑。 – user2864740

+0

我瞭解Python的基本操作順序;我想知道是否有優化好處或句法特殊。 – suchtgott

+0

很少有Python可以做/優化這種情況 - 每一個表達式都被急切地評估爲一個值,因爲它被「執行」了,然後它才能夠提供下一個值。這與大多數常用語言(從JavaScript到C#)類似,與Haskell完全不同,它是一種純粹的函數式語言。 Python程序必須重新選擇懶惰,比如在沒有預先實現源的情況下使用生成器。 – user2864740

回答

0

在這種特殊情況下,range已經像您希望的那樣懶惰了。沒有理由進一步將其輸出封裝在間接層中。當然,Python生成器與Haskell懶惰的常見警告也適用;即多次迭代,或從多個特定點繼續,這在Python中是很痛苦的,但是結果是內存使用通常更容易預測。

+1

在Python 3中,'range'就是'xrange'。 – suchtgott

+0

@mentalCase相關知識!我已更新我的答案,謝謝。 –