0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Memray工具簡(jiǎn)介及安裝與使用方法

Linux愛好者 ? 來源:開源前哨 ? 作者:南風(fēng)草木香 ? 2022-06-15 13:17 ? 次閱讀

【導(dǎo)語(yǔ)】:Memray是一個(gè)可以檢查Python代碼內(nèi)存分配情況的工具,我們可以使用它對(duì)Python解釋器或擴(kuò)展模塊中的代碼進(jìn)行分析,并生成多種統(tǒng)計(jì)報(bào)告,從而更直觀的看到代碼的內(nèi)存分配。

簡(jiǎn)介

開發(fā)者可以根據(jù)需要,生成多種統(tǒng)計(jì)報(bào)告,觀察程序的內(nèi)存分配。

  1. 總結(jié)報(bào)告

該報(bào)告會(huì)把多個(gè)線程的內(nèi)存分配情況顯示到同一個(gè)表格中,own memory表示每個(gè)函數(shù)占用的內(nèi)存,total memory表示函數(shù)本身及其調(diào)用其他函數(shù)所占用的內(nèi)存總量,allocation count表示暫時(shí)未釋放的內(nèi)存?zhèn)€數(shù)。

0e9c0638-ec69-11ec-ba43-dac502259ad0.png

總結(jié)報(bào)告
  1. 火焰圖報(bào)告
該報(bào)告可以將內(nèi)存分配數(shù)據(jù)可視化展示。火焰圖的第一層是占用內(nèi)存的函數(shù), 寬度越大,則占用的內(nèi)存越多;每一層的函數(shù)都被其下一層的函數(shù)所調(diào)用,依次類推。
  • 示例代碼:
defa(n):
returnb(n)

defb(n):
return[c(n),d(n)]

defc(n):
return"a"*n

defd(n):
return"a"*n

a(100000)
  • 生成的火焰圖

0eb53ca2-ec69-11ec-ba43-dac502259ad0.png

火焰圖報(bào)告

由該圖可以看出,函數(shù)a調(diào)用了函數(shù)b,函數(shù)b調(diào)用了函數(shù)c和函數(shù)d。且第一層函數(shù)c和函數(shù)d所占的寬度相同,表示c和d占用的內(nèi)存一樣。

  1. 表格報(bào)告

該報(bào)告以表格的形式展示程序的內(nèi)存使用情況。Thread ID表示對(duì)應(yīng)的線程,Size表示占用的內(nèi)存總數(shù),Allocator表示占用內(nèi)存的函數(shù),Location表示函數(shù)所在的位置。同時(shí),還可以對(duì)每一列的數(shù)據(jù)進(jìn)行排序。

0ec06370-ec69-11ec-ba43-dac502259ad0.png

表格報(bào)告
  1. 樹形報(bào)告

該報(bào)告可以清晰的顯示出程序的調(diào)用層次。樹形報(bào)告中根節(jié)點(diǎn)中的內(nèi)存總量和所占百分比只是針對(duì)于圖中展示的數(shù)據(jù),占用內(nèi)存小的不在圖中。

0ed2f436-ec69-11ec-ba43-dac502259ad0.png

樹形報(bào)告
  1. 統(tǒng)計(jì)報(bào)告

該報(bào)告可以顯示程序內(nèi)存使用情況的詳細(xì)信息,包括分配的內(nèi)存總量、分配類型(例如MALLOC, CALLOC)等。

0ee43368-ec69-11ec-ba43-dac502259ad0.png

統(tǒng)計(jì)報(bào)告

項(xiàng)目地址

https://github.com/bloomberg/memray

安裝

目前只能在Linux平臺(tái)上使用Memray。由于Memray使用了C語(yǔ)言,發(fā)布的版本是二進(jìn)制的,所以得先在系統(tǒng)上安裝二進(jìn)制編譯工具。隨后在Python3.7+的環(huán)境下安裝Memray:

python3-mpipinstallmemray

如果你想安裝開發(fā)版本的Memray,首先要在系統(tǒng)上安裝二進(jìn)制工具:libunwind 和liblz4,隨后克隆項(xiàng)目并運(yùn)行如下命令進(jìn)行安裝:

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

使用

  1. 基本使用

我們可以通過以下命令來追蹤python代碼的內(nèi)存分配情況,my_script.py就是要分析的文件:

python3-mmemrayrunmy_script.py

也可以把memray當(dāng)作命令行工具使用,例如:

memrayrunmy_script.py
memrayrun-mmy_module

以上命令會(huì)輸出一個(gè)二進(jìn)制文件,隨后我們可以根據(jù)需要生成統(tǒng)計(jì)報(bào)告。假如我們想生成一個(gè)總結(jié)報(bào)告,那么可以運(yùn)行如下命令:

memraysummarymy_script.bin

會(huì)生成程序內(nèi)存分配的總結(jié)報(bào)告:

0e9c0638-ec69-11ec-ba43-dac502259ad0.png

總結(jié)報(bào)告

不同的報(bào)告形式在簡(jiǎn)介部分都有展示,請(qǐng)讀者自行查看。

  1. 分析C/C++代碼的內(nèi)存分配

當(dāng)要使用Memray分析numpy或者pandas這種包含C代碼的模塊時(shí),我們可以運(yùn)行如下命令:

memrayrun--nativemy_script.py

從而直觀的看到Python代碼分配了多少內(nèi)存,擴(kuò)展模塊分配了多少內(nèi)存。

假如我們?cè)谝粋€(gè)文件中使用了Numpy,當(dāng)我們不使用--native時(shí),生成的統(tǒng)計(jì)報(bào)告如下圖:

0f09c3a8-ec69-11ec-ba43-dac502259ad0.png

統(tǒng)計(jì)報(bào)告

從圖中可以看出在計(jì)算Numpy數(shù)組時(shí)分配了內(nèi)存,但不清楚是Numpy還是Python解釋器分配了內(nèi)存。通過使用--native命令,就可以得到一個(gè)更全面的報(bào)告,如圖所示:

0f1eed32-ec69-11ec-ba43-dac502259ad0.png

native報(bào)告

從圖中可以看到Numpy中C模塊的調(diào)用情況,當(dāng)添加Numpy數(shù)組后,產(chǎn)生了內(nèi)存分配。我們可以通過文件的后綴名區(qū)分Python模塊和C模塊。

  1. 在代碼運(yùn)行時(shí)查看內(nèi)存分配變化

Memray還支持動(dòng)態(tài)查看Python代碼的內(nèi)存分配情況,我們只需使用以下命令:

memrayrun--livemy_script.py

在這種模式下,開發(fā)者可以調(diào)試運(yùn)行時(shí)間較長(zhǎng)的代碼。下圖即為文件運(yùn)行時(shí)的內(nèi)存分配情況:

0f2c8e74-ec69-11ec-ba43-dac502259ad0.gif

Live模式
  1. 結(jié)果排序

統(tǒng)計(jì)報(bào)告中的結(jié)果通常是根據(jù)分配的總內(nèi)存,從大到小依次排列。我們可以改變排序條件:

  • t (默認(rèn)): 根據(jù)總內(nèi)存排列
  • o: 根據(jù)每個(gè)函數(shù)占用的內(nèi)存排列
  • a: 根據(jù)未釋放的內(nèi)存?zhèn)€數(shù)進(jìn)行排列
  1. 查看其他線程

使用live命令默認(rèn)展示的是主線程的內(nèi)存分配情況,我們可以通過左右箭頭切換到其他線程。

0f530bda-ec69-11ec-ba43-dac502259ad0.png

其他線程
  1. API

除了使用memray run查看Python代碼的內(nèi)存分配,還可以在Python程序中使用memray。

importmemray

withmemray.Tracker("output_file.bin"):
print("Allocationswillbetrackeduntilthewithblockends")

更多細(xì)節(jié)可以查看相關(guān)API文檔[1]。

后記

在我們平時(shí)編寫 Python 代碼的過程中,有時(shí)候只考慮到了業(yè)務(wù)功能的實(shí)現(xiàn),而忽視了代碼的合理性與規(guī)范性,例如內(nèi)存分配就是一個(gè)很重要的點(diǎn),合理的內(nèi)存分配有助于提升項(xiàng)目的運(yùn)行速度。Memray 就是一個(gè)支持查看Python代碼內(nèi)存分配的工具,它的便捷之處在于:我們可以根據(jù)需要,生成多種分析報(bào)告,從而直觀的了解到自己代碼的內(nèi)存分配情況,避免發(fā)生內(nèi)存泄露現(xiàn)象。

你寫 Python 代碼時(shí)關(guān)注過內(nèi)存使用情況嗎?歡迎到評(píng)論中分享~

原文標(biāo)題:8.5K Star! 檢查 Python 代碼內(nèi)存分配的利器

文章出處:【微信公眾號(hào):Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11123

    瀏覽量

    207919
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4671

    瀏覽量

    67770
  • python
    +關(guān)注

    關(guān)注

    53

    文章

    4753

    瀏覽量

    84081
  • 內(nèi)存分配
    +關(guān)注

    關(guān)注

    0

    文章

    16

    瀏覽量

    8290

原文標(biāo)題:8.5K Star! 檢查 Python 代碼內(nèi)存分配的利器

文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Crawler:關(guān)于爬蟲的簡(jiǎn)介、安裝使用方法之詳細(xì)攻略

    Crawler:關(guān)于爬蟲的簡(jiǎn)介、安裝使用方法之詳細(xì)攻略
    發(fā)表于 12-19 16:58

    Py之cython:python庫(kù)之cython的簡(jiǎn)介、安裝使用方法之詳細(xì)攻略

    Py之cython:python庫(kù)之cython的簡(jiǎn)介、安裝使用方法之詳細(xì)攻略
    發(fā)表于 12-19 17:05

    Py之neurolab:Python庫(kù)之neurolab的簡(jiǎn)介、安裝使用方法之詳細(xì)攻略

    Py之neurolab:Python庫(kù)之neurolab的簡(jiǎn)介、安裝使用方法之詳細(xì)攻略
    發(fā)表于 12-20 10:36

    Py之pyserial:Python的pyserial庫(kù)的簡(jiǎn)介、安裝使用方法之詳細(xì)攻略

    Py之pyserial:Python的pyserial庫(kù)的簡(jiǎn)介、安裝、使用方法之詳細(xì)攻略
    發(fā)表于 12-20 10:40

    Crawler之Scrapy:Scrapy簡(jiǎn)介、安裝使用方法之詳細(xì)攻略

    Crawler之Scrapy:Scrapy簡(jiǎn)介、安裝、使用方法之詳細(xì)攻略
    發(fā)表于 12-21 10:43

    關(guān)于Anaconda簡(jiǎn)介安裝、使用方法的詳細(xì)攻略

    DL之Anaconda:關(guān)于Anaconda簡(jiǎn)介、安裝使用方法的詳細(xì)攻略
    發(fā)表于 12-24 11:42

    常見的圖片標(biāo)注工具labelImg的簡(jiǎn)介、安裝使用方法

    labelImg:圖片標(biāo)注工具之labelImg的簡(jiǎn)介、安裝、使用方法詳細(xì)攻略
    發(fā)表于 12-25 10:26

    Python庫(kù)的twisted簡(jiǎn)介安裝使用方法

    Py之twisted:Python庫(kù)之twisted簡(jiǎn)介、安裝、使用方法等詳細(xì)攻略
    發(fā)表于 12-25 10:03

    Python庫(kù)的PyMySQL簡(jiǎn)介安裝使用方法

    Py之PyMySQL:Python庫(kù)之PyMySQL的簡(jiǎn)介安裝、使用方法之詳細(xì)攻略
    發(fā)表于 12-26 10:40

    Python庫(kù)的Shutil簡(jiǎn)介安裝使用方法

    Py之Shutil:Python庫(kù)之Shutil簡(jiǎn)介安裝、使用方法之詳細(xì)攻略
    發(fā)表于 12-27 16:46

    Python庫(kù)的Xlrd簡(jiǎn)介安裝使用方法

    Py之Xlrd:Python庫(kù)之Xlrd簡(jiǎn)介安裝、使用方法之詳細(xì)攻略
    發(fā)表于 12-27 16:46

    Python庫(kù)的ipykernel簡(jiǎn)介安裝使用方法

    Py之ipykernel:Python庫(kù)之ipykernel簡(jiǎn)介安裝、使用方法之詳細(xì)攻略
    發(fā)表于 12-27 16:47

    python庫(kù)之basemap安裝使用方法

    Py之basemap:python庫(kù)之basemap的簡(jiǎn)介安裝、使用方法之詳細(xì)攻略
    發(fā)表于 12-28 10:24

    lightgbm的簡(jiǎn)介、安裝、使用方法

    Py之lightgbm:lightgbm的簡(jiǎn)介安裝、使用方法之詳細(xì)攻略
    發(fā)表于 06-01 08:42

    JSON工具簡(jiǎn)介安裝使用方法說明

    JSON Hero 是一個(gè)簡(jiǎn)單實(shí)用的 JSON 工具,通過簡(jiǎn)介美觀的 UI 及增強(qiáng)的額外功能,使得閱讀和理解 JSON 文檔變得更容易、直觀。
    的頭像 發(fā)表于 05-25 12:40 ?3822次閱讀