更新於 2024/09/20閱讀時間約 1 分鐘

[Python]使用memory_profiler測量 Python程式記憶體使用情況

memory_profiler 是一個用來測量 Python 程式記憶體使用情況的工具,它可以幫助開發者了解程式的記憶體消耗,特別是在執行長時間運行或處理大量數據的程式時非常有用。

有別於tracemalloc模組,memory_profiler能在每一行程式碼上顯示記憶體變化,但相對的就不適合埋在程式內長期監控用,因為很吃效能,比較適合分析大範圍的記憶體使用情況,比如檢測程式中哪些操作消耗了大量的記憶體。特別適合處理大數據集或進行大量數據處理的應用。


tracemalloc模組文章

[Python]查看程式碼占用多少記憶體

[Python]使用tracemalloc 模組來比較兩種不同方法所佔用的記憶體大小


memory_profiler

提供了詳細的函數層級的記憶體使用追蹤報告,並可用來檢查程式中哪些部分消耗較多的記憶體。

安裝

要使用 memory_profiler,首先需要安裝它:

pip install memory-profiler

基本用法

memory_profiler 的使用方式主要有兩種:

  1. 使用 @profile 裝飾器來標記需要追蹤的函數。
  2. 使用 mprof 來進行更全面的記憶體分析。


使用 @profile 裝飾器

  1. 首先,必須將程式碼保存在檔案中,並加上 @profile 裝飾器來標記想要追蹤記憶體使用的函數。
  2. 然後使用 python -m memory_profiler your_script.py 執行該檔案。

@profile 程式範例:

from memory_profiler import profile

@profile
def my_func():
a = [1] * (10**6) # 佔用較多記憶體
b = [2] * (2 * 10**7) # 佔用更多記憶體
del b # 釋放記憶體
return a

if __name__ == "__main__":
my_func()

當你執行這段程式碼時,memory_profiler 會提供記憶體使用的詳細資訊,像是每一行程式碼執行時記憶體的變化。

執行指令:

python -m memory_profiler your_script.py

1. Line #(行號)

  • 表示程式碼中的行號,即這一行程式碼在檔案中的位置。

2. Mem usage(記憶體使用)

  • 程式在執行到這一行時,總的記憶體使用量(以 MiB 為單位,1 MiB ≈ 1.05 MB)。
  • 這是實體記憶體的總使用量,包括所有變數、數據結構等佔用的記憶體。

3. Increment(增量)

  • 這一行程式碼執行後,記憶體使用量相對於上一行的變化量。
  • 如果增量為正,表示這一行程式碼增加了記憶體的使用;如果增量為負,表示記憶體被釋放(例如 del 語句釋放了內存)。
  • 這是非常重要的一列,因為它能幫助你定位記憶體使用出現異常增長的地方。

4. Occurrences(次數)

  • 表示該行程式碼執行的次數。這對於了解循環或多次調用函數的情況非常有用。
  • 如果某一行被多次執行,記憶體使用可能會累積,通過這個欄位你可以知道這種累積是否來自於多次調用。

5. Line Contents(程式碼內容)

  • 顯示實際的程式碼內容,即每行程式碼的具體內容。

使用 mprof 進行全面分析

除了 @profile 裝飾器外,你也可以使用 mprof 來追蹤整個程式的記憶體使用情況,並生成圖表。

  1. 首先啟動記憶體追蹤:
    mprof run your_script.py
  2. 然後生成圖表:
    mprof plot

首先啟動記憶體追蹤

生成圖表

這將會產生一個圖形,顯示隨著時間變化的記憶體使用情況


謝謝大家觀看,若喜歡的話,希望可以追蹤,點愛心給予鼓勵


若在Jupyter Notebook執行的話


  1. 安裝 memory_profiler: 如果你還沒有安裝 memory_profiler,可以通過以下指令安裝它:
    pip install memory-profiler
  2. 啟用 memory_profiler 魔術命令: 在 Jupyter Notebook 中,使用 %load_ext 命令來加載 memory_profiler 的魔術命令。
    %load_ext memory_profiler
  3. 使用 %mprun 魔術命令進行記憶體分析: 在你要進行記憶體分析的函數之前加上 %mprun 魔術命令,指定你要分析的函數。

參考資料





分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.