列表解析表示式
先來看乙個例子~ leetcode 171 題
解法很簡單:
sum=0
for i in
range(0
,len
(s):
sum+=
26**
(len
(s)-
1- i)*(
ord(s[i])-
ord(
"a")+1
)return
sum
那麼,這裡也可以這麼寫。
return
sum([26
**(len(s)-1
- i)*(
ord(s[i])-
ord(
"a")+1
)for i in
range(0
,len
(s))
])
下面的簡寫方法,我們稱作python的列表解析表示式
。酷酷的 o(╥﹏╥)o有沒有
再來延伸看一下這麼寫的好處(記憶體占用)
上**:
import timeit
import os
import psutil
# 準備乙個5000w 元素的列表 備用
list
=range(0
,50000000
)# 計算占用記憶體
defshow_memory_info
(hint)
: pid = os.getpid(
) p = psutil.process(pid)
info = p.memory_full_info(
) memory = info.uss /
1024./
1024
print
('{} memory used: {} mb'
.format
(hint, memory)
)# 時間
start1 = timeit.default_timer(
)list1 =
for x in
(list):
if x ==
20000000
: show_memory_info(
'1')
if x >4:
show_memory_info(
'2')
end1 = timeit.default_timer(
)print
('running time: {} seconds'
.format
(end1 - start1)
)start2 = timeit.default_timer(
)show_memory_info(
'3')
# 2. 生成器生成元素到新列表,注意這裡沒有賦值到新列表
(x for x in
(list
)if x >4)
show_memory_info(
'4')
end2 = timeit.default_timer(
)print
('running time: {} seconds'
.format
(end2 - start2)
)
執行程式,得到的結果如下:
1 memory used: 783.5625 mb
2 memory used: 1945.28125 mb
running time: 11.129049652 seconds
3 memory used: 1945.28125 mb
4 memory used: 1945.28125 mb
running time: 0.09404864300000071 seconds
關注幾點:
時間上的差別1:普通遍歷
時間為9秒,而生成器遍歷
(沒有建立新列表時間為0.09秒),這個原因在我之前的迭代和生產的對比 部落格也寫過了,是因為只呼叫了演算法
時間上的關注點3:如果我把生成器賦值list2 = (x for x in (list) if x > 4) ,這段**的時間是4秒。
可得出,生成器本身生生成元素只是呼叫了演算法,而並未賦值(實際占用記憶體)
記憶體上的關注點: 同3所說,生成器賦值才產生記憶體占用,故而更快。
思考語法糖其實是迭代的乙個延伸,合理的運用不僅可以使**變酷,讓別人看不懂,也是可以優化程式執行速度和記憶體占用的。
python3 列表解析與generator生成器
t 1,2,3,4 print t t x 10 for x in t print t t x 10 for x in range 10 print t 輸出為 如 所示的兩種列表解析的情況 第一種,先建立了乙個list物件,在in後面接這個list物件 第二種,直接在in後面接乙個range物件 ...
python3 列表解析與generator生成器
t 1,2,3,4 print t t x 10 for x in t print t t x 10 for x in range 10 print t 輸出為 如 所示的兩種列表解析的情況 第一種,先建立了乙個list物件,在in後面接這個list物件 第二種,直接在in後面接乙個range物件 ...
python3 迭代器 python3 迭代器
auther aaron fan 可以直接作用於for迴圈的物件統稱為可迭代物件 iterable 可以使用isinstance 判斷乙個物件是否是iterable物件 from collections import iterable isinstance iterable true isinsta...