用 mprof 指令畫 Python 記憶體用量圖
Posted on Sep 11, 2023 in Python 模組/套件推薦 , Python 程式設計 - 中階 by Amo Chen ‐ 2 min read
這陣子做記憶體用量相關的研究時,就在想怎麼視覺化(visualize) Python 執行時隨時間變化的記憶體用量,當然,步驟越簡單越好。
查了才知道,知名的 memory_profiler 已經把這件事情搞定。
一起來看怎麼畫 Python 記憶體用量圖吧!
本文環境
- Python
- memory_profiler
pip install memory_profiler matplotlib
memory_profiler
memory_profiler 是 1 用來剖析 Python 記憶體用量的套件,它提供 1 個 @profile
裝飾子(decorator)給開發者使用,用來監測每一行 Python 程式碼的記憶體用量,例如下列範例程式用 @profile
裝飾子監控 func()
函式的記憶體用量:
# test.py
import string
import time
from random import choices
from memory_profiler import profile
@profile
def func():
a = []
for i in range(0, 10000):
x = ''.join(choices(string.ascii_letters, k=8))
a.append(x)
if i % 500 == 0:
time.sleep(1)
if __name__ == '__main__':
func()
上述範例可以用以下 2 種指令(擇一)查看記憶體用量:
$ python -m memory_profiler test.py
或
$ python test.py
執行結果如下圖,可以看到每 1 行的記憶體用量都顯示出來:
mprof 指令
安裝 memory_profiler 之後,會有 1 個 mprof
指令可以使用,這個指令可以執行 Python 程式,並產生記憶體剖析報告:
$ mprof run test.py
執行成功之後,會出現一個名為 mprofile_<時間戳>.dat
的檔案,這個檔案裡面存著每個時間點的記憶體用量數據(預設 0.1s 存一次),檔案內容大致如下所示:
CMDLINE /bin/python3.8 test.py
MEM 0.156250 1694398620.7860
MEM 14.625000 1694398620.8912
MEM 14.625000 1694398620.9965
MEM 14.625000 1694398621.1013
MEM 14.625000 1694398621.2066
MEM 14.625000 1694398621.3114
MEM 14.625000 1694398621.4168
p.s. 也就是說你只要符合這個格式,不管什麼語言的記憶體用量,都可以用 mprof plot
指令畫出來
產生 mprofile_<時間戳>.dat
之後,就可以用 mprof plot
指令,直接畫出 Python 記憶體用量的圖:
$ mprof plot
mprof plot
預設會載入所有符合 mprofile_<時間戳>.dat
檔名格式的檔案,如果只需要載入特定檔案,可以在指令後加上檔名:
$ mprof plot mprofile_<時間戳>.dat
成功執行的話,就會有類似以下的圖可以查看:
有了這張漂亮又專業的圖,肯定可以增加你帶給同事的專業感!
以上!
Enjoy!