[] 在運行代碼時,我們常常想要知道代碼運行記憶體占用情況。很多情況下我們想知道是不是自己哪個迴圈寫的太繁瑣了,或者是在哪一步可以用更小的記憶體來實現等。所以需要我們對程式整體、某一部分代碼、某一變數運行記憶體使用有更直觀的瞭解。 在本地運行代碼如PyCharm和遠程運行代碼如VScode中都是如何查看內 ...
目錄
在運行代碼時,我們常常想要知道代碼運行記憶體占用情況。很多情況下我們想知道是不是自己哪個迴圈寫的太繁瑣了,或者是在哪一步可以用更小的記憶體來實現等。所以需要我們對程式整體、某一部分代碼、某一變數運行記憶體使用有更直觀的瞭解。
在本地運行代碼如PyCharm和遠程運行代碼如VScode中都是如何查看記憶體使用情況的?
記憶體分析器Memory Profiler
這是一個python模塊,用於監控進程的記憶體消耗以及對python程式的記憶體消耗進行逐行分析。它是一個純 python 模塊,依賴於psutil模塊。
pip 安裝:pip install -U memory_profiler
對象
sys.getsizeof()——以位元組為單位返回對象的大小。
sys.getsizeof只計算實際使用的記憶體大小,引用所消耗的記憶體大小不計算。sys.getsizeof只能作為計算記憶體大小的參考~
代碼及結果
import sys
a = [0,1,2,3,4]*2
memory_a = sys.getsizeof(a)
print("a記憶體占用:%i位元組"%memory_a)
a記憶體占用:144位元組
函數
如果想要對某一函數做性能分析,在需要做性能分析的函數前面加裝飾器 @profile
代碼及結果
from memory_profiler import profile
import time
@profile # 在需要做性能分析的函數前面加裝飾器 @profile
def my_func1(c):
a = [1] * (10 ** c)
b = [2] * (2 * 10 ** 7)
time.sleep(5)
del b
del a
print("+++++++++")
def my_func2():
p = [0,1,2,3,4,5]
P = p*2
print(P)
if __name__ == '__main__':
c=6
my_func1(c)
my_func2()
+++++++++
Filename: E:/平時筆記/test/memory_test.py
Line Mem usage Increment Occurrences Line Contents
4 36.4 MiB 36.4 MiB 1 @profile # 在需要做性能分析的函數前面加裝飾器 @profile
5
6 def my_func1(c):
7 44.1 MiB 7.6 MiB 1 a = [1] * (10 ** c)
8 196.7 MiB 152.6 MiB 1 b = [2] * (2 * 10 ** 7)
9 196.7 MiB 0.0 MiB 1 time.sleep(5)
10 44.1 MiB -152.6 MiB 1 del b
11 36.4 MiB -7.6 MiB 1 del a
12 36.4 MiB 0.0 MiB 1 print("+++++++++")
[0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5]
如果想要將函數性能分析的結果保存到文件方便查看,可直接用
@profile(precision=4, stream=open("memory_profiler.log", "w+"))
結果解讀
列名 | 含義 |
---|---|
Mem usage | 記憶體占用情況 |
Increment | 執行該行代碼後新增的記憶體 |
Occurences | 執行次數 |
Line Contents | 行內容 |
程式整體基於時間的記憶體使用
mprof使用
命令 | 含義 |
---|---|
mprof run | 運行可執行文件,記錄記憶體使用情況 |
mprof plot | 繪製一個記錄的記憶體使用情況(預設情況下,最後一個) |
mprof list | 以用戶友好的方式列出所有記錄的記憶體使用情況文件 |
mprof clean | 刪除所有記錄的記憶體使用情況文件 |
mprof rm | 刪除特定記錄的記憶體使用情況文件 |
代碼及結果
import time
def my_func1(c):
a = [1] * (10 ** c)
b = [2] * (2 * 10 ** 7)
time.sleep(5)
del b
del a
print("+++++++++")
def my_func2():
time.sleep(5)
p = [0,1,2,3,4,5]
P = p*2
print(P)
if __name__ == '__main__':
c=6
my_func1(c)
my_func2()
在PyCharm的終端(Terminal)輸入:
mprof run memory_test.py
+++++++++
[0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5]
mprof plot
python查看記憶體使用
import psutil
import os
info = psutil.virtual_memory()
print(u'記憶體使用:',psutil.Process(os.getpid()).memory_info().rss)
print(u'總記憶體:',info.total)
print(u'記憶體占比:',info.percent)
print(u'cpu個數:',psutil.cpu_count())