第9條 用生成器表達式改寫數據量比較大的列表推導

前面我們談到,利用列表推導來代替mapfilter,但是當數據量比較大時,使用列表推導需要把數據全部加載到內存當中,會消耗大量內存,導致程序崩潰。

下面讀取文件中的數據,此種方式只適合文件小的情況下,當文件較大時,open()操作返回的文件對象會保存在內存中,再使用列表推導取出數據。

value = [x for x in open('./test.txt')]
print(value)
1.生成器表達式

爲了解決此類問題Python提供了生成器表達式(generator expression),它是對列表推導和生成器的一種泛化。

生成器表達式在運行的過程中並不會把整個輸出序列都求出來,而是會產生一個迭代器,每次依據上一次的結果產生新的數據,直到數據遍歷結束。

把實現列表推導的那段表達式放在一對括號內,就構成了生成器表達式。對生成器表達式求值的時候,會返回一個迭代器,而不會深入處理文件的內容。

注意 生成器表達式所返回的迭代器是有狀態的,每次調用完next後,就不能返回到先前的狀態,不能反覆使用

it =len(x) for x in open('./test.txt))#返回迭代器
print(it)

通過調用內置的next函數,即可使其按照生成器表達式來輸出一個值。多次調用next便會使得迭代器不斷推進。

print(next(it))
print(next(it)))
2. 生成器表達式組合

把某個生成器表達式所返回的迭代器,放在另外一個生成器表達式的for子表達式中,可以產生連鎖反映。

roots = ((x,x**0.5) for x in it)

外圍的迭代器每次向前推進時,會推動內部的迭代器向前更新,串在一起的生成器表達式在執行速度上是很快的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章