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

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

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
raw-image

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

首先啟動記憶體追蹤

raw-image

生成圖表

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

raw-image


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


若在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 魔術命令,指定你要分析的函數。

參考資料





avatar-img
128會員
209內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
螃蟹_crab的沙龍 的其他內容
有別於先前利用time模組做成裝飾器計算程式執行的時間,Python 標準庫中的timeit 模組是專門用來測量小段程式碼的執行時間。 [Python][裝飾器]計算函式(CT)處理時間 這篇文章將介紹如何使用 timeit.timeit() 函數,並提供一些範例來展示它的應用。
re 模組基本介紹 re 模組是 Python 用來處理正則表達式的標準模組。 正則表達式是一種用於描述字串模式的語法,可以用來匹配、搜尋、分割和替換字串中的特定模式。
對於程式卡頓的問題,如何分析程式碼占用多少記憶體,如何釋放或改寫,可以先用python內建的tracemalloc模組來追蹤 Python 分配的記憶體區塊。 本文將介紹最簡單的用法,來分析一段程式碼占用了多少記憶體。 結果呈現 印出當前使用的記憶體,與峰值記憶體使用量。 程式範例 i
在實務上,若Python報錯時,若引入的套件越多伴隨的異常訊息會變得越來越複雜,看到一推密密麻麻的內容時,很多時候都想直接跳過。 本文將利用Traceback來讓異常訊息變得更好理解。
當我們在做很多處理時,結果可能會是List包住一些數值,例如找輪廓或連通域分析時,沒有剛好的特徵可能就會有List含(空值得)形式出現。 為了避免報錯,我們就要額外先做一些處理,先做判斷是否有值在往下一個階段。 all 和 any 是 Python 中用於檢查可迭代物件(如清單、元組、集合等)
在現實生活中,充滿的警報及安全措施,總會設個安全線在那,若觸碰到底線時則會有警報響起。 在Python也有類似的作法,如果希望在某個條件達到時,就拉起警報不要讓程式繼續進行下去,就適合使用raise 這種機制讓開發者能夠在程序執行時檢測到不正確的條件,然後通過引發異常停止程序的執行或通知使用者。
有別於先前利用time模組做成裝飾器計算程式執行的時間,Python 標準庫中的timeit 模組是專門用來測量小段程式碼的執行時間。 [Python][裝飾器]計算函式(CT)處理時間 這篇文章將介紹如何使用 timeit.timeit() 函數,並提供一些範例來展示它的應用。
re 模組基本介紹 re 模組是 Python 用來處理正則表達式的標準模組。 正則表達式是一種用於描述字串模式的語法,可以用來匹配、搜尋、分割和替換字串中的特定模式。
對於程式卡頓的問題,如何分析程式碼占用多少記憶體,如何釋放或改寫,可以先用python內建的tracemalloc模組來追蹤 Python 分配的記憶體區塊。 本文將介紹最簡單的用法,來分析一段程式碼占用了多少記憶體。 結果呈現 印出當前使用的記憶體,與峰值記憶體使用量。 程式範例 i
在實務上,若Python報錯時,若引入的套件越多伴隨的異常訊息會變得越來越複雜,看到一推密密麻麻的內容時,很多時候都想直接跳過。 本文將利用Traceback來讓異常訊息變得更好理解。
當我們在做很多處理時,結果可能會是List包住一些數值,例如找輪廓或連通域分析時,沒有剛好的特徵可能就會有List含(空值得)形式出現。 為了避免報錯,我們就要額外先做一些處理,先做判斷是否有值在往下一個階段。 all 和 any 是 Python 中用於檢查可迭代物件(如清單、元組、集合等)
在現實生活中,充滿的警報及安全措施,總會設個安全線在那,若觸碰到底線時則會有警報響起。 在Python也有類似的作法,如果希望在某個條件達到時,就拉起警報不要讓程式繼續進行下去,就適合使用raise 這種機制讓開發者能夠在程序執行時檢測到不正確的條件,然後通過引發異常停止程序的執行或通知使用者。
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
上兩篇有關List的文章,此篇文上兩章的延續,整理一些常用的方法和操作。 [Python]List(列表)新增、修改、刪除元素 [Python基礎]容器 list(列表),tuple(元組) 還有一些常用的 list 方法和操作,讓你能更靈活地處理列表數據
Thumbnail
在 Python 中,print( ) 函數用於將結果輸出到螢幕上。當你嘗試將不同資料型別(例如字串和數字)混合在一起輸出時,print( )函數無法直接處理這些不同型別的資料,因此你需要先將它們轉換為相同的資料型別。通常,這意味著需要將數字轉換為字串型別,以便與其他字串一同輸出。 雖然我們也可以
Thumbnail
呈上篇,若是在大型系統中使用,重複被調用時,在每次紀錄時都會創建一個新的 FileHandler,這會導致日誌處理器不斷累積,從而使日誌重複記錄。 [Python]使用logging創建兩個以上的日誌紀錄 使用__new__的方法來避免重複調用 改良後 setup_logger 方法中創建一
Thumbnail
對於程式卡頓的問題,如何分析程式碼占用多少記憶體,如何釋放或改寫,可以先用python內建的tracemalloc模組來追蹤 Python 分配的記憶體區塊。 本文將介紹最簡單的用法,來分析一段程式碼占用了多少記憶體。 結果呈現 印出當前使用的記憶體,與峰值記憶體使用量。 程式範例 i
此篇文章連結 RAM 與 C語言陣列的關係並提供陣列與for-loop 使用的相關教學 前半段為基本電腦觀念、後半段為實作能力的教學
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
在一次五天的年假中,我決定開始學習Python編程。雖然最初進展順利,但後來發現自己在解題和邏輯方面遇到了困難。經過思考後,我決定轉而學習C/C++,並且制定了一個計畫,希望成為一名後端工程師。這將需要挑戰我的時間管理能力。
Thumbnail
在 Python 中,dir() 函式用於列舉對象的所有屬性和方法。這包括對象的內建屬性、方法以及自定義的屬性和方法。以下是一個簡單的示例: 列舉所有屬性與方法 class MyClass: def __init__(self): self.attribute1 = 42
Thumbnail
關於多執行緒/多行程的使用方式 在Python 3.2版本之後加入了「concurrent.futures」啟動平行任務, 它可以更好的讓我們管理多執行緒/多行程的應用場景,讓我們在面對這種併發問題時可以不必害怕, 用一個非常簡單的方式就能夠處裡, 底下我們將為您展示一段程式碼: imp
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
上兩篇有關List的文章,此篇文上兩章的延續,整理一些常用的方法和操作。 [Python]List(列表)新增、修改、刪除元素 [Python基礎]容器 list(列表),tuple(元組) 還有一些常用的 list 方法和操作,讓你能更靈活地處理列表數據
Thumbnail
在 Python 中,print( ) 函數用於將結果輸出到螢幕上。當你嘗試將不同資料型別(例如字串和數字)混合在一起輸出時,print( )函數無法直接處理這些不同型別的資料,因此你需要先將它們轉換為相同的資料型別。通常,這意味著需要將數字轉換為字串型別,以便與其他字串一同輸出。 雖然我們也可以
Thumbnail
呈上篇,若是在大型系統中使用,重複被調用時,在每次紀錄時都會創建一個新的 FileHandler,這會導致日誌處理器不斷累積,從而使日誌重複記錄。 [Python]使用logging創建兩個以上的日誌紀錄 使用__new__的方法來避免重複調用 改良後 setup_logger 方法中創建一
Thumbnail
對於程式卡頓的問題,如何分析程式碼占用多少記憶體,如何釋放或改寫,可以先用python內建的tracemalloc模組來追蹤 Python 分配的記憶體區塊。 本文將介紹最簡單的用法,來分析一段程式碼占用了多少記憶體。 結果呈現 印出當前使用的記憶體,與峰值記憶體使用量。 程式範例 i
此篇文章連結 RAM 與 C語言陣列的關係並提供陣列與for-loop 使用的相關教學 前半段為基本電腦觀念、後半段為實作能力的教學
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
在一次五天的年假中,我決定開始學習Python編程。雖然最初進展順利,但後來發現自己在解題和邏輯方面遇到了困難。經過思考後,我決定轉而學習C/C++,並且制定了一個計畫,希望成為一名後端工程師。這將需要挑戰我的時間管理能力。
Thumbnail
在 Python 中,dir() 函式用於列舉對象的所有屬性和方法。這包括對象的內建屬性、方法以及自定義的屬性和方法。以下是一個簡單的示例: 列舉所有屬性與方法 class MyClass: def __init__(self): self.attribute1 = 42
Thumbnail
關於多執行緒/多行程的使用方式 在Python 3.2版本之後加入了「concurrent.futures」啟動平行任務, 它可以更好的讓我們管理多執行緒/多行程的應用場景,讓我們在面對這種併發問題時可以不必害怕, 用一個非常簡單的方式就能夠處裡, 底下我們將為您展示一段程式碼: imp