一邊迴圈一邊計算的機制,稱之為生成器generator;生成器的建立具有兩種方式:
1、 第一種是直接使用生成器表示式,也就是將列表解析的中括號修改為圓括號即可
2、第二種是在乙個函式的定義中包含yield關鍵字,那麼這個函式也就是乙個生成器
生成器是特定的函式,允許返回乙個值,然後暫停**的執行,稍後回覆,在使用生成器的時候,記憶體可以使用更友好的結構,如下:
>>> sum(len(word) for line in open('kel.log') for word in line.split()) #注意在使用的時候先新建乙個檔案為kel.log生成器表示式就像是乙個懶惰的列表解析,只有在迴圈的時候,才會真正的去進行計算,從而比較節省記憶體。31
[root@python 49]# cat getlongest.py #寫的乙個指令碼,直接執行即可,在這裡使用的是生成器表示式來返回乙個檔案中最長的行數#!/usr/bin/env python
'''this is get the file longest line
'''lo = max((len(line) for line in open('kel.log') ))
print lo
[root@python 49]# cat kel.log #檔名稱為kel.log,檔案內容如下所示
this is the test file of the generator
this is anoter line
linie
there is a lone line in the last line,for the generator
以上表示是直接使用生成器表示式來生成乙個生成器generator。
python的生成器:生成器就是乙個具有yield語句的函式,乙個函式或者子程式只返回一次,生成器能暫停執行並返回乙個中間結果,這也就是yield關鍵字的作用。
做了乙個測試,分別使用列表解析的方式和生成器的方式來測試執行時間和使用的記憶體情況:
import timestart_time = time.time()
lo = max((len(line) for line in open('kel.log') )) #使用列表解析
print lo
end_time = time.time()
print end_time-start_time #列印程式執行的時間
測試結果如下:
[root@python 49]# du -sh使用列表解析來進行測試:1.1g .
[root@python 49]# python getlongest.py #使用的記憶體大概為900多m,基本將所有的資料都儲存在cache當中
4799.72497296333 #使用的時間單位為妙
start_time = time.time()lo = max([len(line) for line in open('kel.log') ]) #使用列表解析來直接生成乙個列表
print lo
end_time = time.time()
print end_time-start_time
測試結果如下:
[root@python 49]# python getlongest.py #使用的記憶體也差不多也是900多m占用記憶體情況如下:47910.0769059658#使用時間為秒
[root@python ~]# vmstat 1 -s m 3可以看倒memory中的記憶體數量大量減少,然後cache中占用的數量變大,在進行清除快取的時候,使用命令如下:procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 196 0 730 0 0 50 6 13 8 0 0 100 0 0
0 0 0 196 0 730 0 0 0 0 18 7 0 0 100 0 0
0 0 0 196 0 730 0 0 8 0 26 28 0 0 97 3 0
[root@python ~]# echo 1 > /proc/sys/vm/drop_caches #表示僅清除頁面快取,pagecache
從以上可以看到,無論是列表解析還是生成器表示式都會將所有的資料匯入到記憶體中。。。說好的生成器表示式節省記憶體呢???乙個生成器的函式的例子如下,使用了yield關鍵字的函式為生成器generator:
#!/usr/bin/env python使用的時候如下:def counter(start_at=0):
count = start_at
while true:
val = (yield count)
if val is not none:
count = val
else:
count += 1
count = counter()在其中send方法表示進行重置生成器,而close方法是關閉生成器,在此呼叫next方法的時候會出現stopiteration的異常print count.next()
print count.next()
count.send(9)
print count.next()
print count.next()
count.close()
列表解析與生成器
1 語法 返回值 for 元素 in 可迭代物件 if 條件 使用中括號,內部是for迴圈,if條件語句可選 返回乙個新列表 高階 expr for i in iterable for j in iterable2 等價於 ret for i initerable1 for j in iterabl...
Python之道 列表解析和生成器
python版本 2.7.4 主機環境 gentoo with linux kernel 3.4.36 列表解析完成的功能可以使用for迴圈替代或者map呼叫來替代。對於剛開始使用python的初學者,通常使用簡單的for迴圈,邏輯清晰,這樣會容易理解,特別是在巢狀的時候。效能對比 map呼叫比等效...
python 列表解析式和生成器
可以根據已有列表,高效建立新列表的方式。列表解析是python迭代機制的一種應用,它常用於實現建立新的列表,返回的是乙個列表,因此用在中。列表解析式因編譯器進行優化,提高了效率,減少出錯,增加可讀性 示例1 生成乙個列表,元素0 9,對每乙個元素自增1後求平方返回新列表 常規寫法 new for i...