Python3 列表解析和迭代器的記憶體占用過程分析

2021-10-01 06:53:35 字數 2319 閱讀 3944

列表解析表示式

先來看乙個例子~ 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...