成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

簡介

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

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

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

圖片

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

2.火焰圖報(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)存一樣。

3.表格報(bào)告

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

圖片

表格報(bào)告

4.樹形報(bào)告

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

圖片

樹形報(bào)告

5.統(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平臺上使用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 git@github.com: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

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

memray summary my_script.bin

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

圖片

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

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

2.分析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)存。

假如我們在一個文件中使用了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命令,就可以得到一個 更全面的報(bào)告,如圖所示:

圖片

native報(bào)告

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

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

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

memray run --live my_script.py

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

圖片

Live模式

4.結(jié)果排序

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

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

5.查看其他線程

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

圖片

其他線程

6.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)存分配就是一個很重要的點(diǎn),合理的內(nèi)存分配有助于 提升項(xiàng)目的運(yùn)行速度。Memray 就是一個支持查看Python代碼內(nèi)存分配的工具,它的便捷之處在于:我們可以根據(jù)需要,生成多種分析報(bào)告,從而直觀的了解到自己代碼的內(nèi)存分配情況,避免發(fā)生內(nèi)存泄露現(xiàn)象。

責(zé)任編輯:張燕妮 來源: 開源前哨
相關(guān)推薦

2020-08-05 17:16:53

GitHub 技術(shù)開源

2021-07-14 10:00:32

Python內(nèi)存測量

2021-08-24 23:23:35

Python工具開發(fā)

2022-04-28 13:17:10

低代碼開發(fā)工具

2019-09-10 16:25:19

Python內(nèi)存空對象

2021-02-28 13:22:54

Java內(nèi)存代碼

2018-02-08 14:57:22

對象內(nèi)存分配

2021-12-16 06:52:33

C語言內(nèi)存分配

2010-09-25 15:40:52

配置JVM內(nèi)存

2019-04-24 09:25:14

Python編程語言代碼

2025-05-15 09:55:14

IoT開源內(nèi)網(wǎng)穿透

2015-11-16 11:22:05

Java對象內(nèi)存分配

2018-04-08 08:45:53

對象內(nèi)存策略

2009-06-03 15:52:34

堆內(nèi)存棧內(nèi)存Java內(nèi)存分配

2010-09-25 14:12:50

Java內(nèi)存分配

2023-12-21 08:02:31

React DnD拖拽庫組件

2020-10-28 09:50:05

GitHubPython項(xiàng)目

2022-03-16 08:39:19

StackHeap內(nèi)存

2019-02-01 15:40:59

Python代碼規(guī)范編程語言

2020-10-21 09:28:25

JS變量的內(nèi)存分配
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 99精品国产一区二区青青牛奶 | 国产成人精品一区二 | 成人精品在线观看 | 99精品免费在线观看 | 日韩视频一区二区 | 国产精品福利在线观看 | 欧美久久精品一级c片 | 欧美综合在线观看 | 欧美日韩国产精品激情在线播放 | 国产一区二区三区久久久久久久久 | 国产成人精品综合 | 亚洲成人999| 欧州一区二区三区 | 麻豆av一区二区三区久久 | 中文字幕综合 | 中文字幕第一页在线 | 午夜伊人 | k8久久久一区二区三区 | 在线日韩精品视频 | 欧美成人一区二免费视频软件 | 亚洲情综合五月天 | 亚洲伊人久久综合 | 中文字幕成人在线 | 狠狠狠干 | 亚洲精品乱码久久久久久蜜桃91 | 6080亚洲精品一区二区 | 亚洲女人天堂成人av在线 | 日韩综合网 | 一区二区中文字幕 | 精品久久一区 | 天天操欧美 | 一二三四av | 亚洲一区国产精品 | 日韩中文字幕在线视频 | 激情婷婷 | 国产农村一级国产农村 | 国产精品永久免费视频 | 国产欧美一区二区三区在线看 | 手机在线一区二区三区 | 成人无遮挡毛片免费看 | 国产精品久久久久一区二区三区 |