一行代碼搞定Python逐行內(nèi)存消耗分析

添加微信號"CNFeffery"加入技術(shù)交流群
?本文完整示例代碼及文件已上傳至我的
?Github倉庫https://github.com/CNFeffery/PythonPracticalSkills
這是我的系列文章「Python實用秘技」的第6期,本系列立足于筆者日常工作中使用Python積累的心得體會,每一期為大家?guī)硪粋€幾分鐘內(nèi)就可學(xué)會的簡單小技巧。
作為系列第6期,我們即將學(xué)習(xí)的是:一行代碼分析Python代碼行級別內(nèi)存消耗。

很多情況下,我們需要對已經(jīng)寫好的Python程序的內(nèi)存消耗進(jìn)行優(yōu)化,但是一段代碼在運(yùn)行過程中的內(nèi)存消耗是動態(tài)變化的,這種時候就可以用到memory_profiler這個第三方庫,它可以幫助我們分析記錄Python腳本中,執(zhí)行到每一行時,內(nèi)存的消耗及波動變化情況。
memory_profiler的使用方法超級簡單,使用pip install memory_profiler完成安裝后,只需要從memory_profiler導(dǎo)入profile并作為要分析的目標(biāo)函數(shù)的裝飾器即可,譬如下面這個例子:
?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[a?????
????del?a,?b
????return?a_,?b_
if?__name__?==?'__main__':
????demo()
接著在終端執(zhí)行python demo.py,稍事等待后,就會看到打印出的分析結(jié)果報告(這里我是在jupyter lab里執(zhí)行的終端命令):

其中Line #列記錄了分析的各行代碼具體行位置,Mem usage列記錄了當(dāng)程序執(zhí)行到該行時,當(dāng)前進(jìn)程占用內(nèi)存的量,Increment記錄了當(dāng)前行相比上一行內(nèi)存消耗的變化量,Occurrences記錄了當(dāng)前行的執(zhí)行次數(shù)(循環(huán)、列表推導(dǎo)等代碼行會記作多次),Line Contents列則記錄了具體對應(yīng)的行代碼。
通過這樣細(xì)致的內(nèi)存分析結(jié)果,我們就能有的放矢地優(yōu)化我們的代碼啦~
本期分享結(jié)束,咱們下回見~??

加入知識星球【我們談?wù)摂?shù)據(jù)科學(xué)】
500+小伙伴一起學(xué)習(xí)!
·?推薦閱讀?·
