当前位置: 首页 > 后端技术 > Python

8.5K星!Python代码内存分析工具

时间:2023-03-26 16:24:36 Python

【介绍】:Memray是一个可以检查Python代码内存分配情况的工具,我们可以用它来分析Python解释器或者扩展模块中的代码,并生成多个统计报告,所以可以更直观的看到代码的内存分配情况。简介开发者可以根据需要生成各种统计报告,观察程序的内存分配情况。Summaryreport这个报表会在同一个表中显示多个线程的内存分配情况,ownmemory表示每个函数占用的内存,totalmemory表示函数本身和调用的其他函数占用的内存总量,allocationcount表示暂时未释放的内存数量。SummaryReportFlameGraphReport该报告可以可视化内存分配数据。火焰图的第一层是内存占用函数。宽度越大,占用内存越多;每一层的函数都被下一层的函数调用,以此类推。示例代码: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占用的内存是一样的。表格报告此报告以表格形式显示程序的内存使用情况。ThreadID表示对应的线程,Size表示占用内存总量,Allocator表示占用内存的函数,Location表示函数所在的位置。同时,您还可以对每一列的数据进行排序。表格报表树形报表该报表可以清楚地显示程序的调用级别。树形报告中根节点的内存总量和百分比只针对图中显示的数据,内存占用小的没有显示在图中。TreeReportStatisticalReport该报表可以显示程序内存使用的详细信息,包括分配内存总量、分配类型(如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基本使用我们可以使用如下命令来跟踪python代码的内存分配情况,my_script.py是要分析的文件:python3-mmemrayrunmy_script.py即可也可以使用memray作为命令行工具,例如:memrayrunmy_script.pymemrayrun-mmy_module上面的命令会输出一个二进制文件,然后我们就可以根据需要生成统计报告了。如果我们要生成汇总报告,可以运行以下命令:memraysummarymy_script.bin会生成程序内存分配的汇总报告:汇总报告的不同报表形式在介绍部分展示,请查看它自己。分析C/C++代码的内存分配在使用Memray分析numpy或pandas等包含C代码的模块时,我们可以运行以下命令:memrayrun--nativemy_script.py直观地查看Python代码分配了多少内存,扩展模块分配了多少内存。如果我们在文件中使用Numpy,不使用--native时,生成的统计报告如下:Statisticalreport从图中可以看出在计算Numpy数组的时候分配了内存,但是不清楚无论是Numpy还是Python解释器分配的内存。通过--native命令,可以得到更全面的报告,如图:nativereport从图中可以看到Numpy中C模块的调用。添加Numpy数组时,会发生内存分配。我们可以通过文件扩展名来区分Python模块和C模块。在代码运行时查看内存分配变化Memray也支持动态查看Python代码的内存分配情况,我们只需要使用如下命令:memrayrun--livemy_script.py在该模式下,开发者可以调试长时间运行的脚本代码.下图是文件运行时的内存分配情况:实时模式结果排序统计报告中的结果通常按照分配的总内存从大到小的顺序排列。我们可以改变排序条件:t(默认):按照总内存排列o:按照各个函数占用的内存排列a:按照未释放内存数排列查看其他线程使用live命令显示内存默认主线程的分配情况,我们可以通过左右箭头切换到其他线程。除了可以使用memrayrun查看Python代码的内存分配,其他线程API也可以在Python程序中使用memray。importmemraywithmemray.Tracker("output_file.bin"):print("Allocationswillbetrackeduntilthewithblockends")后记在写Python代码的过程中,有时候我们只考虑业务功能的实现而忽略了保证代码的合理性和规范性,比如内存分配是很重要的一点。合理的内存分配有助于提高项目的运行速度。Memray是一个支持查看Python代码内存分配情况的工具。它的方便在于我们可以根据需要生成各种分析报告,从而直观的了解我们代码的内存分配情况,避免内存泄漏。你在写Python代码的时候关注过内存的使用吗?以上就是本次分享的全部内容。觉得文章还不错的话,请关注公众号:Python编程学习圈,每日干货分享,发送“J”还能领取大量学习资料。或者去编程学习网了解更多编程技术知识。