【導語】:Memray是一個可以檢查Python代碼內存分配情況的工具,我們可以使用它對Python解釋器或擴展模塊中的代碼進行分析,并生成多種統計報告,從而更直觀的看到代碼的內存分配。
簡介
開發者可以根據需要,生成多種統計報告,觀察程序的內存分配。
- 總結報告
該報告會把多個線程的內存分配情況顯示到同一個表格中,own memory
表示每個函數占用的內存,total memory
表示函數本身及其調用其他函數所占用的內存總量,allocation count
表示暫時未釋放的內存個數。
總結報告
- 火焰圖報告
- 示例代碼:
defa(n):
returnb(n)
defb(n):
return[c(n),d(n)]
defc(n):
return"a"*n
defd(n):
return"a"*n
a(100000)
- 生成的火焰圖
火焰圖報告
由該圖可以看出,函數a調用了函數b,函數b調用了函數c和函數d。且第一層函數c和函數d所占的寬度相同,表示c和d占用的內存一樣。
- 表格報告
該報告以表格的形式展示程序的內存使用情況。Thread ID
表示對應的線程,Size
表示占用的內存總數,Allocator
表示占用內存的函數,Location
表示函數所在的位置。同時,還可以對每一列的數據進行排序。
表格報告
- 樹形報告
該報告可以清晰的顯示出程序的調用層次。樹形報告中根節點中的內存總量和所占百分比只是針對于圖中展示的數據,占用內存小的不在圖中。
樹形報告
- 統計報告
該報告可以顯示程序內存使用情況的詳細信息,包括分配的內存總量、分配類型(例如MALLOC, CALLOC
)等。
統計報告
項目地址
https://github.com/bloomberg/memray
安裝
目前只能在Linux平臺上使用Memray。由于Memray使用了C語言,發布的版本是二進制的,所以得先在系統上安裝二進制編譯工具。隨后在Python3.7+的環境下安裝Memray:
python3-mpipinstallmemray
如果你想安裝開發版本的Memray,首先要在系統上安裝二進制工具:libunwind 和liblz4
,隨后克隆項目并運行如下命令進行安裝:
gitclonegit@github.com:bloomberg/memray.gitmemray
cdmemray
python3-mvenv../memray-env/#justanexample,putthiswhereveryouwant
source../memray-env/bin/activate
python3-mpipinstall--upgradepip
python3-mpipinstall-e.-rrequirements-test.txt-rrequirements-extra.txt
使用
- 基本使用
我們可以通過以下命令來追蹤python代碼的內存分配情況,my_script.py就是要分析的文件:
python3-mmemrayrunmy_script.py
也可以把memray當作命令行工具使用,例如:
memrayrunmy_script.py
memrayrun-mmy_module
以上命令會輸出一個二進制文件,隨后我們可以根據需要生成統計報告。假如我們想生成一個總結報告,那么可以運行如下命令:
memraysummarymy_script.bin
會生成程序內存分配的總結報告:
總結報告
不同的報告形式在簡介部分都有展示,請讀者自行查看。
- 分析C/C++代碼的內存分配
當要使用Memray分析numpy或者pandas這種包含C代碼的模塊時,我們可以運行如下命令:
memrayrun--nativemy_script.py
從而直觀的看到Python代碼分配了多少內存,擴展模塊分配了多少內存。
假如我們在一個文件中使用了Numpy,當我們不使用--native
時,生成的統計報告如下圖:
統計報告
從圖中可以看出在計算Numpy數組時分配了內存,但不清楚是Numpy還是Python解釋器分配了內存。通過使用--native
命令,就可以得到一個更全面的報告,如圖所示:
native報告
從圖中可以看到Numpy中C模塊的調用情況,當添加Numpy數組后,產生了內存分配。我們可以通過文件的后綴名區分Python模塊和C模塊。
- 在代碼運行時查看內存分配變化
Memray還支持動態查看Python代碼的內存分配情況,我們只需使用以下命令:
memrayrun--livemy_script.py
在這種模式下,開發者可以調試運行時間較長的代碼。下圖即為文件運行時的內存分配情況:
Live模式
- 結果排序
統計報告中的結果通常是根據分配的總內存,從大到小依次排列。我們可以改變排序條件:
- t (默認): 根據總內存排列
- o: 根據每個函數占用的內存排列
- a: 根據未釋放的內存個數進行排列
- 查看其他線程
使用live
命令默認展示的是主線程的內存分配情況,我們可以通過左右箭頭切換到其他線程。
其他線程
- API
除了使用memray run
查看Python代碼的內存分配,還可以在Python程序中使用memray。
importmemray
withmemray.Tracker("output_file.bin"):
print("Allocationswillbetrackeduntilthewithblockends")
更多細節可以查看相關API文檔[1]。
后記
在我們平時編寫 Python 代碼的過程中,有時候只考慮到了業務功能的實現,而忽視了代碼的合理性與規范性,例如內存分配就是一個很重要的點,合理的內存分配有助于提升項目的運行速度。Memray 就是一個支持查看Python代碼內存分配的工具,它的便捷之處在于:我們可以根據需要,生成多種分析報告,從而直觀的了解到自己代碼的內存分配情況,避免發生內存泄露現象。
你寫 Python 代碼時關注過內存使用情況嗎?歡迎到評論中分享~
原文標題:8.5K Star! 檢查 Python 代碼內存分配的利器
文章出處:【微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。
-
Linux
+關注
關注
87文章
11322瀏覽量
209868 -
代碼
+關注
關注
30文章
4803瀏覽量
68754 -
python
+關注
關注
56文章
4800瀏覽量
84821 -
內存分配
+關注
關注
0文章
16瀏覽量
8312
原文標題:8.5K Star! 檢查 Python 代碼內存分配的利器
文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論