• GitHub上8.5K 收藏! Python 代码内存分析的利器


    【导语】:Memray是一个可以检查Python代码内存分配情况的工具,我们可以使用它对Python解释器或扩展模块中的代码进行分析,并生成多种统计报告,从而更直观的看到代码的内存分配。

    简介

    开发者可以根据需要,生成多种统计报告,观察程序的内存分配。

    1. 总结报告

    该报告会把多个线程的内存分配情况显示到同一个表格中,own memory表示每个函数占用的内存,total memory表示函数本身及其调用其他函数所占用的内存总量,allocation count表示暂时未释放的内存个数。

    总结报告

    1. 火焰图报告 

    该报告可以将内存分配数据可视化展示。火焰图的第一层是占用内存的函数, 宽度越大,则占用的内存越多;每一层的函数都被其下一层的函数所调用,依次类推。

    • 示例代码:

    1. def a(n):
    2.     return b(n)
    3. def b(n):
    4.     return [c(n), d(n)]
    5. def c(n):
    6.     return "a" * n
    7. def d(n):
    8.     return "a" * n
    9. a(100000)
    • 生成的火焰图

    火焰图报告

    由该图可以看出,函数a调用了函数b,函数b调用了函数c和函数d。且第一层函数c 和函数d所占的宽度相同,表示c和d占用的内存一样。

    1. 表格报告

    该报告以表格的形式展示程序的内存使用情况。Thread ID表示对应的线程,Size表示占用的内存总数,Allocator表示占用内存的函数,Location表示函数所在的位置。同时,还可以对每一列的数据进行排序。

    表格报告

    1. 树形报告

    该报告可以清晰的显示出程序的调用层次。树形报告中根节点中的内存总量和所占百分比 只是针对于图中展示的数据,占用内存小的不在图中。

    树形报告

    1. 统计报告

    该报告可以显示程序内存使用情况的详细信息,包括分配的内存总量、分配类型(例如MALLOC, CALLOC)等。

    统计报告

    项目地址

    https://github.com/bloomberg/memray
    

    安装

    目前只能在Linux平台上使用Memray。由于Memray使用了C语言,发布的版本 是二进制的,所以得先在系统上安装二进制编译工具。随后在Python3.7+的环境 下安装Memray:

    python3 -m pip install memray
    

    如果你想安装开发版本的Memray,首先要在系统上安装二进制工具:libunwind 和liblz4,随后克隆项目并运行如下命令进行安装:

    1. git clone git@github.com:bloomberg/memray.git memray
    2. cd memray
    3. python3 -m venv ../memray-env/  # just an example, put this wherever you want
    4. source ../memray-env/bin/activate
    5. python3 -m pip install --upgrade pip
    6. python3 -m pip install -e . -r requirements-test.txt -r requirements-extra.txt

    使用

    1. 基本使用

    我们可以通过以下命令来追踪python代码的内存分配情况,my_script.py就是要分析的文件:

    python3 -m memray run my_script.py
    

    也可以把memray当作命令行工具使用,例如:

    1. memray run my_script.py
    2. memray run -m my_module

    以上命令会输出一个二进制文件,随后我们可以根据需要生成统计报告。假如我们想生成一个总结报告,那么可以运行如下命令:

    memray summary my_script.bin
    

    会生成程序内存分配的总结报告:

    总结报告

    不同的报告形式在简介部分都有展示,请读者自行查看。

    1. 分析C/C++代码的内存分配

    当要使用Memray分析numpy或者pandas这种包含C代码的模块时,我们可以运行如下命令:

    memray run --native my_script.py
    

    从而直观的看到Python代码分配了多少内存,扩展模块分配了多少内存。

    假如我们在一个文件中使用了Numpy,当我们不使用--native时,生成的统计报告如下图:

    统计报告

    从图中可以看出在计算Numpy数组时分配了内存,但不清楚是Numpy还是Python解释器分配了内存。通过使用--native命令,就可以得到一个 更全面的报告,如图所示:

    native报告

    从图中可以看到Numpy中C模块的调用情况,当添加Numpy数组后,产生了内存分配。我们可以通过文件的后缀名区分Python模块和C模块。

    1. 在代码运行时查看内存分配变化

    Memray还支持动态查看Python代码的内存分配情况,我们只需使用以下命令:

    memray run --live my_script.py
    

    在这种模式下,开发者可以调试运行时间较长的代码。下图即为文件运行时的内存分配情况:

    Live模式

    1. 结果排序

    统计报告中的结果通常是根据分配的总内存,从大到小依次排列。我们可以改变排序条件:

    • t (默认): 根据总内存排列

    • o: 根据每个函数占用的内存排列

    • a: 根据未释放的内存个数进行排列

    1. 查看其他线程

    使用live命令默认展示的是主线程的内存分配情况,我们可以通过左右箭头切换到其他线程。

    其他线程

    1. API

    除了使用memray run查看Python代码的内存分配,还可以在Python程序中使用memray。

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

    更多细节可以查看相关API文档[1]。

    后记

    在我们平时编写 Python 代码的过程中,有时候只考虑到了业务功能的实现,而忽视了代码的合理性与规范性,例如内存分配就是一个很重要的点,合理的内存分配有助于 提升项目的运行速度。

    Memray 就是一个支持查看Python代码内存分配的工具,它的便捷之处在于:我们可以根据需要,生成多种分析报告,从而直观的了解到自己代码的内存分配情况,避免发生内存泄露现象。

    你写 Python 代码时关注过内存使用情况吗?

    【python学习】
    学Python的伙伴,欢迎加入新的交流【君羊】:1020465983
    一起探讨编程知识,成为大神,群里还有软件安装包,实战案例、学习资料

  • 相关阅读:
    网络安全概述
    第九章 设置结构化日志记录(一)
    Iphone自带的邮箱 每次发完邮件在已发送里会显示重复发送了两封
    将VMProtect集成到应用程序教程之实模式(三):测试结果
    来看看安卓机的几个应用程序
    Eureka注册中心
    ThreadLocal线程变量
    嵌入式分享合集28
    Kafka系列之:深入理解过期时间TTL
    Spring Cloud Gateway网关两种负载均衡
  • 原文地址:https://blog.csdn.net/SixStar_FL/article/details/125439769