当前位置: 首页 > 科技观察

8.5K星!一款强大的Python代码内存分配检查工具

时间:2023-03-13 00:56:06 科技观察

介绍开发者可以根据需要生成各种统计报告,观察程序的内存分配情况。1.汇总报表该报表会在同一张表中显示多个线程的内存分配情况,ownmemory表示各个函数占用的内存,totalmemory表示函数本身和调用其他函数占用的内存总量functions中,allocationcount表示暂时未释放的内存数量。总结报告2.火焰图报告该报告可以可视化内存分配数据。火焰图的第一层是内存占用函数。宽度越大,占用内存越多;每一层的函数都被下一层的函数调用,以此类推。示例代码:defa(n):returnb(n)defb(n):return[c(n),d(n)]defc(n):return"a"*ndefd(n):return"a"*na(100000)生成的火焰图报告从图中可以看出,函数a调用函数b,函数b调用函数c和函数d。而第一层函数c和函数d占用的宽度是一样的,也就是说c和d占用的内存是一样的。3.表格报告该报告以表格形式显示程序的内存使用情况。ThreadID表示对应的线程,Size表示占用内存总量,Allocator表示占用内存的函数,Location表示函数所在的位置。同时,您还可以对每一列的数据进行排序。表格报表4.树形报表这个报表可以清晰的显示程序的调用级别。树形报告中根节点的内存总量和百分比只针对图中显示的数据,内存占用小的没有显示在图中。树状报表5.统计报表该报表可以显示程序内存使用的详细信息,包括分配内存总量、分配类型(如MALLOC、CALLOC)等。统计报表项目地址https://github.com/bloomberg/memray安装目前,Memray只能在Linux平台上使用。由于Memray使用C语言,发布的版本是二进制的,所以必须先在系统上安装二进制编译工具。然后在Python3.7+环境下安装Memray:python3-mpipinstallmemray如果要安装开发版的Memray,首先在系统上安装二进制工具:libunwind和liblz4,然后clone项目,运行如下命令即可install:gitclonegit@github.com:bloomberg/memray.gitmemraycdmemraypython3-mvenv../memray-env/#只是一个例子,把它放在你想要的任何地方source../memray-env/bin/activatepython3-mpip安装--升级pippython3-mpipinstall-e。-rrequirements-test.txt-rrequirements-extra.txt使用1.基本使用我们可以使用以下命令来跟踪python代码的内存分配情况,待分析的是my_script.py文件:python3-mmemrayrunmy_script。py也可以将memray作为命令行工具来使用,例如:memrayrunmy_script.pymemrayrun-mmy_module上面的命令会输出一个二进制文件,然后我们就可以根据需要生成统计报告了。如果我们要生成汇总报告,可以运行以下命令:memraysummarymy_script.bin会生成程序内存分配的汇总报告:汇总报告的不同报表形式在介绍部分展示,请查看它自己。2.分析C/C++代码的内存分配在使用Memray分析numpy或pandas等包含C代码的模块时,我们可以运行如下命令:memrayrun--nativemy_script.py直观地看到Python代码的分配情况如何muchmemory,扩展模块分配了多少内存。如果我们在文件中使用Numpy,不使用--native时,生成的统计报告如下:Statisticalreport从图中可以看出在计算Numpy数组的时候分配了内存,但是不清楚无论是Numpy还是Python解释器分配的内存。通过--native命令,可以得到更全面的报告,如图:nativereport从图中可以看到Numpy中C模块的调用。添加Numpy数组时,会发生内存分配。我们可以通过文件扩展名来区分Python模块和C模块。3.检查代码运行长代码时的内存分配变化。下图是文件运行时的内存分配情况:实时模式4.结果排序统计报表中的结果通常按照分配的总内存从大到小的顺序排列。我们可以改变排序条件:t(默认):按照总内存排列o:按照各个函数占用的内存排列a:按照未释放内存数排列5.查看其他线程使用live命令显示默认主线程根据内存分配情况,我们可以通过左右箭头切换到其他线程。其他线程6.API除了可以使用memrayrun查看Python代码的内存分配,在Python程序中也可以使用memray。importmemraywithmemray.Tracker("output_file.bin"):print("Allocationswillbetrackeduntilthewithblockends")更多细节请参考相关API文档[1]。后记在编写Python代码的过程中,有时我们只考虑业务功能的实现,而忽略了代码的合理性和规范性。比如内存分配是很重要的一点。合理的内存分配有助于提高项目运行的速度。Memray是一个支持查看Python代码内存分配情况的工具。它的方便在于我们可以根据需要生成各种分析报告,从而直观的了解我们代码的内存分配情况,避免内存泄漏。