用 mprof 指令畫 Python 記憶體用量圖

Posted on  Sep 11, 2023  in  Python 模組/套件推薦 , Python 程式設計 - 中階  by  Amo Chen  ‐ 2 min read

這陣子做記憶體用量相關的研究時,就在想怎麼視覺化(visualize) Python 執行時隨時間變化的記憶體用量,當然,步驟越簡單越好。

查了才知道,知名的 memory_profiler 已經把這件事情搞定。

一起來看怎麼畫 Python 記憶體用量圖吧!

本文環境

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 行的記憶體用量都顯示出來:

report.png

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

成功執行的話,就會有類似以下的圖可以查看:

mprof_plot.png

有了這張漂亮又專業的圖,肯定可以增加你帶給同事的專業感!

以上!

Enjoy!

References

memory-profiler

對抗久坐職業傷害

研究指出每天增加 2 小時坐著的時間,會增加大腸癌、心臟疾病、肺癌的風險,也造成肩頸、腰背疼痛等常見問題。

然而對抗這些問題,卻只需要工作時定期休息跟伸展身體即可!

你想輕鬆改變現狀嗎?試試看我們的 PomodoRoll 番茄鐘吧! PomodoRoll 番茄鐘會根據你所設定的專注時間,定期建議你 1 項辦公族適用的伸展運動,幫助你打敗久坐所帶來的傷害!

贊助我們的創作

看完這篇文章了嗎? 休息一下,喝杯咖啡吧!

如果你覺得 MyApollo 有讓你獲得實用的資訊,希望能看到更多的技術分享,邀請你贊助我們一杯咖啡,讓我們有更多的動力與精力繼續提供高品質的文章,感謝你的支持!