Re: [翻譯] Google 建議的 Python 風格指南 7

看板Python作者 (殘雲奪月)時間11年前 (2013/05/03 20:22), 編輯推噓2(201)
留言3則, 1人參與, 最新討論串3/3 (看更多)
python 的 list comprehension 有分兩種, 一種是[i for i in xrange(5)],這種形式產生出來的是 list 另外一種形式是 (i for i in xrange(5)),這種形式產生出來的是 generator : 為了產生一個可以 iterate 的東西就要寫一個完整的 generator 也太多餘 我想 uranusjr 大大說這句話,應該是指使用 (i for i in xrange(5)) 這種形式。 : 我的認知是,list comprehension 是把 generator 拿去跑並把結果裝在 list 裡, : 既然真的跑了,物件也被生出來裝在 list 裡, : 和用 for 迴圈生 list 的效能有差嗎? 我想 changyuheng 大大說的應該是 [i for i in xrange(5)] 這種形式。 至於 generator 的效能有沒有比 for loop 好我就不清楚了。 通常 generator 會拿來和 list 做比較 generator 某種程度上算是 Lazy Computation。 他不會一次產生所有的物件,而是需要該物件時才會產生。 舉個例子: data = [0, 1, 2, 3, 4, 5, 6] a = [i for i in data]: # 這種寫法他會把 data 裡的資料先複製一份出來 print a[3] # 可以印出 3 for i in [i for i in data]: if i > 3: break # 上面這個情形,因為他會先把資料複製一份出來 # 所以 5, 6 你有複製,實際上卻沒被使用 # 做白工 b = (i for i in data): # 這種寫法他只會產生一個 generator, # 而非建立一個list for i in (i for i in data): if i > 3: break # 上面這種情形,5, 6 並不會被複製 # 因此效能較高 註1: 因為 python 有對小整數(-5~256)做快取的動作,因此上面說的複製未必 是真的複製。簡單的例子如下 a = 5 b = 4 print id(a), id(b + 1) a = -8 b = -9 print id(a), id(b + 1) 註2: cpython 中的 id 函數回傳值為記憶體位址 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.165.83.178

05/07 01:42, , 1F
感謝您回應。就我認知 list comprehension 是把 gener
05/07 01:42, 1F

05/07 01:42, , 2F
ator 拿去跑
05/07 01:42, 2F

05/07 01:53, , 3F
05/07 01:53, 3F
文章代碼(AID): #1HWwl_1W (Python)
文章代碼(AID): #1HWwl_1W (Python)