「Python實用祕技06」逐行監聽Python程式的記憶體消耗

費弗裡發表於2022-02-23

本文完整示例程式碼及檔案已上傳至我的Github倉庫https://github.com/CNFeffery/PythonPracticalSkills

  這是我的系列文章「Python實用祕技」的第6期,本系列立足於筆者日常工作中使用Python積累的心得體會,每一期為大家帶來一個幾分鐘內就可學會的簡單小技巧。

  作為系列第6期,我們即將學習的是:一行程式碼分析Python程式碼行級別記憶體消耗

「Python實用祕技06」逐行監聽Python程式的記憶體消耗

  很多情況下,我們需要對已經寫好的Python程式的記憶體消耗進行優化,但是一段程式碼在執行過程中的記憶體消耗是動態變化的,這種時候就可以用到memory_profiler這個第三方庫,它可以幫助我們分析記錄Python指令碼中,執行到每一行時,記憶體的消耗及波動變化情況。

  memory_profiler的使用方法超級簡單,使用pip install memory_profiler完成安裝後,只需要從memory_profiler匯入profile並作為要分析的目標函式的裝飾器即可,譬如下面這個例子:

demo.py

import numpy as np
from memory_profiler import profile

@profile
def demo():
    a = np.random.rand(10000000)
    b = np.random.rand(10000000)
    
    a_ = a[a < b]
    b_ = b[a < b]
    
    del a, b

    return a_, b_


if __name__ == '__main__':
    demo()

  接著在終端執行python demo.py,稍事等待後,就會看到列印出的分析結果報告(這裡我是在jupyter lab裡執行的終端命令):

「Python實用祕技06」逐行監聽Python程式的記憶體消耗

  其中Line #列記錄了分析的各行程式碼具體行位置,Mem usage列記錄了當程式執行到該行時,當前程式佔用記憶體的量,Increment記錄了當前行相比上一行記憶體消耗的變化量,Occurrences記錄了當前行的執行次數(迴圈、列表推導等程式碼行會記作多次),Line Contents列則記錄了具體對應的行程式碼。

  通過這樣細緻的記憶體分析結果,我們就能有的放矢地優化我們的程式碼啦~


  本期分享結束,我們們下回見~?

相關文章