首頁 > 軟體

python memory_profiler庫生成器和迭代器記憶體佔用的時間分析

2022-06-28 18:05:04

不進行計算時,生成器和list空間佔用

import time
from memory_profiler import profile
@profile(precision=4)
def list_fun():
	start = time.time()
	total = ([i for i in range(5000000)])
	print('iter_spend_time:',time.time()-start)

@profile(precision=4)
def gent_func():
	gent_start = time.time()
	total = (i for i in range(5000000))

	print('gent_spend_time:',time.time()-gent_start)

iter_fun()
gent_func()

顯示結果的含義:第一列表示已分析程式碼的行號,第二列(Mem 使用情況)表示執行該行後 Python 直譯器的記憶體使用情況。第三列(增量)表示當前行相對於最後一行的記憶體差異。最後一列(行內容)列印已分析的程式碼。
分析:在不進行計算的情況下,列表list和迭代器會佔用空間,但對於
生成器不會佔用空間

當需要計算時,list和生成器的花費時間和佔用記憶體

使用sum內建函數,list和生成器求和10000000個資料list記憶體佔用較大生成器花費時間大概是list的兩倍

import time
from memory_profiler import profile
@profile(precision=4)
def iter_fun():
	start = time.time()
	total = sum([i for i in range(10000000)])
	print('iter_spend_time:',time.time()-start)
@profile(precision=4)
def gent_func():
	gent_start = time.time()
	total = sum(i for i in range(10000000))

	print('gent_spend_time:',time.time()-gent_start)

iter_fun()
gent_func()

比較分析,如果需要對資料進行迭代使用時,生成器方法的耗時較長,但記憶體使用方面還是較少,因為使用生成器時,記憶體只儲存每次迭代計算的資料。分析原因時個人認為,生成器的迭代計算過程中,在迭代資料和計算直接不斷轉換,相比與迭代器物件中先將資料全部儲存在記憶體中(雖然佔記憶體,但讀取比再次迭代要快),因此,生成器比較費時間,但佔用記憶體小。

記錄資料迴圈求和500000個資料,迭代器和生成器迴圈得到時

總結:幾乎同時完成,迭代器的佔用記憶體較大

import time
from memory_profiler import profile
itery = iter([i for i in range(5000000)])
gent = (i for i in range(5000000))
@profile(precision=4)
def iter_fun():
	start = time.time()
	total= 0
	for item in itery:
		total+=item
	print('iter:',time.time()-start)
@profile(precision=4)
def gent_func():
	gent_start = time.time()
	total = 0
	for item in gent:
		total+=item
	print('gent:',time.time()-gent_start)
iter_fun()
gent_func()

list,迭代器和生成器共同使用sum計算5000000個資料時間比較

總結:list+sum和迭代器+sum計算時長差不多,但生成器+sum計算的時長幾乎長一倍

import time
from memory_profiler import profile
@profile(precision=4)
def list_fun():
	start = time.time()
	print('start!!!')
	list_data = [i for i in range(5000000)]
	total = sum(list_data)
	print('iter_spend_time:',time.time()-start)
@profile(precision=4)
def iter_fun():
	start = time.time()
	total = 0
	total = sum(iter([i for i in range(5000000)]))
	print('total:',total)
	print('iter_spend_time:',time.time()-start)

@profile(precision=4)
def gent_func():
	gent_start = time.time()
	total = sum(i for i in range(5000000))
	print('total:',total)
	print('gent_spend_time:',time.time()-gent_start)
list_fun()
iter_fun()
gent_func()

到此這篇關於python memory_profiler庫生成器和迭代器記憶體佔用的時間分析的文章就介紹到這了,更多相關python的memory_profiler 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com