1. 程式人生 > >python中生成器與列表推導式的說明差異

python中生成器與列表推導式的說明差異

python中生成器和列表推導式的說明與優劣

一.概念

1. 列表推導式是一種python風格的明顯體現,這種寫法不僅高效而且簡短.

使用列表推導式獲取"下標":

>>>{key:value for key,value in enumerate(["one", "two","three"])}
{0: 'one', 1: 'two', 2: 'three'}

反之想讓列表獲取"下標":

>>>lst = ["one", "two","three"]
>>>i = 0
>>>for v in lst:
	   lst[i] = "%d:%s" % (i,lst[i])
	   i += 1
>>>lst
[0: 'one', 1: 'two', 2: 'three']

2.生成器(generator)

生成器時一種特殊的迭代器

(1).什麼時候需要使用生成器

一般情況下我們不需要使用生成器,只有當我們因為效能限制才需要用到,比如我們使用python讀取一個10g的檔案,如果一次性將10g的檔案載入到記憶體處理的話(read方法),記憶體肯定會溢位;這裡如果可以使用生成器把讀寫交叉處理進行,比如使用(readline和readlines)就可以再迴圈讀取的同時不斷處理,這樣就可以節省大量的記憶體空間.

(2)生成生成器的兩種方法

第一種直接將列表推導式[]改為()即可

i = (x for x in range(10))

第二種就是在函式中加入"yield"關鍵字;yield和return類似,都可以用來返回值,不同之處在於yield遇見next()就返回,再次執行時從上次返回的yield語句處繼續執行.

二.兩者的差異

(1)

列表推導式時將多有的值一次性載入到記憶體中;

生成器則不會將所有的值一次載入,而是延遲計算,一次返回一個結果,它不會一次生成所有結果,這樣對大量資料的處理十分有用

>>>import sys
>>>i = [x for x in range(10000)]
>>>j = (x for x in range(10000))
>>>sys.getsizeof(i)
87624
>>>sys.getsizeof(j)
88

顯而易見,列表推導式佔用很多的記憶體,而生成器幾乎沒什麼佔用記憶體

(2)

列表推導式可以遍歷任意次

生成器只能遍歷一次

這裡需要理解一下迭代器的工作原理:迭代器是屬於一個臨時區,會安排一些元素進去,但是隻有使用的時候才會建立易一些臨時區,一旦遍歷結束則臨時區清空,再便利的話就失效了,這也正說明迭代器和生成器能夠減少記憶體的開銷