<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          8.5K Star! Python 代碼內(nèi)存分析的利器

          共 3449字,需瀏覽 7分鐘

           ·

          2022-06-24 17:22


          【導(dǎo)語】: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ù)。

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

          def b(n):
              return [c(n), d(n)]

          def c(n):
              return "a" * n

          def d(n):
              return "a" * n

          a(100000)
          • 生成的火焰圖

          火焰圖報(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)行排序。

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

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

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

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

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

          項(xiàng)目地址

          https://github.com/bloomberg/memray

          安裝

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

          python3 -m pip install memray

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

          git clone [email protected]:bloomberg/memray.git memray
          cd memray
          python3 -m venv ../memray-env/  # just an example, put this wherever you want
          source ../memray-env/bin/activate
          python3 -m pip install --upgrade pip
          python3 -m pip install -e . -r requirements-test.txt -r requirements-extra.txt

          使用

          1. 基本使用

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

          python3 -m memray run my_script.py

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

          memray run my_script.py
          memray run -m my_module

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

          memray summary my_script.bin

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

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

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

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

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

          memray run --native my_script.py

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

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

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

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

          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)存分配情況,我們只需使用以下命令:

          memray run --live my_script.py

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

          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)存分配情況,我們可以通過左右箭頭切換到其他線程。

          其他線程
          1. API

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

          import memray

          with memray.Tracker("output_file.bin"):
              print("Allocations will be tracked until the with block ends")

          更多細(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)存使用情況嗎?

          參考資料:

          [1]

          API文檔: https://bloomberg.github.io/memray/api.html

          Python貓技術(shù)交流群開放啦!群里既有國(guó)內(nèi)一二線大廠在職員工,也有國(guó)內(nèi)外高校在讀學(xué)生,既有十多年碼齡的編程老鳥,也有中小學(xué)剛剛?cè)腴T的新人,學(xué)習(xí)氛圍良好!想入群的同學(xué),請(qǐng)?jiān)诠?hào)內(nèi)回復(fù)『交流群』,獲取貓哥的微信(謝絕廣告黨,非誠(chéng)勿擾?。?/span>~


          還不過癮?試試它們




          如何用 Docker 構(gòu)建企業(yè)級(jí) PyPi 服務(wù)?

          Python 函數(shù)為什么會(huì)默認(rèn)返回 None?

          在 Google 工作十年后的感悟

          Python 程序調(diào)試分析大殺器合集

          Python 工匠:寫好面向?qū)ο蟠a的原則(中)

          Python在計(jì)算內(nèi)存時(shí)應(yīng)該注意的問題?


          如果你覺得本文有幫助
          請(qǐng)慷慨分享點(diǎn)贊,感謝啦!
          瀏覽 48
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产豆花一区二区三区 | 国产美女操逼网 | 大香蕉伊人无限 | 日韩精品一区二区在线观看 | 1超碰在线 |