返回介绍

建议82:使用 memory_profiler 和 objgraph 剖析内存使用

发布于 2024-01-30 22:19:09 字数 2553 浏览 0 评论 0 收藏 0

Python还提供了一些工具可以用来查看内存的使用情况以及追踪内存泄露(如memory_profiler、objgraph、cProfile、PySizer及Heapy等),或者可视化地显示对象之间的引用(如objgraph),从而为发现内存问题提供更直接的证据。本节最后我们再来看看memory_profiler和objgraph这两个工具的使用。

(1)memory_profiler

安装memory_profiler可以使用命令easy_install-U memory_profiler或者pipinstall-U memory_profiler,也可进行源码安装。需要注意的是,在Windows平台上需要先安装依赖包psutil。memory_profiler的使用非常简单,在需要进行内存分析的代码之前用@profile进行装饰,然后运行命令python-m memory_profiler文件名,便可以输出每一行代码的内存使用以及增长情况。

import memory_profiler
  @profile
  def fibonacci(n):
  .......

以代码memory_profiler_test.py为例,输出列分别对应为行号、内存使用情况、内存增长情况以及行所对应的内容。如下所示:

Line #  Mem usage  Increment   Line Contents
================================================
                  @profile
      8.648 MB   0.000 MB   def fibonacci(n):
     11.500 MB   2.852 MB       if n < 0:
                          return -1
     11.500 MB   0.000 MB       elif n <= 1:
     11.500 MB   0.000 MB           return 1
     11.500 MB   0.000 MB       else:
     11.500 MB   0.000 MB           return fibonacci(n -1) + fibo
nacci(n -2)

更多关于memory_profiler的信息可以参考https://pypi.python.org/pypi/memory_profiler。

(2)Objgraph

Objgraph的安装非常简单,可以使用命令pip install objgraph,或者直接从https://pypi.python.org/pypi/objgraph下载进行源码安装。Objgraph的功能大致可以分为以下3类:

统计。如objgraph.count(typename[, objects])表示根据传入的参数显示被gc跟踪的对象的数目;objgraph.show_most_common_types([limit=10, objects])表示显示常用类型对应的对象的数目。

定位和过滤对象。如objgraph.by_type(typename[, objects])表示根据传入的参数显示被gc跟踪的对象信息;objgraph.at(addr)表示根据给定的地址返回对象。

遍历和显示对象图。如objgraph.show_refs(objs[, max_depth=3, extra_ignore=(), filter=None, too_many=10, highlight=None, filename=None, extra_info=None, refcounts=False])表示从对象objs开始显示对象引用关系图;objgraph.show_backrefs(objs[, max_depth=3, extra_ignore=(), filter=None, too_many=10, highlight=None, filename=None, extra_info=None, refcounts=False])表示显示以objs的引用作为结束的对象关系图。

更多关于objgraph使用的API文档参见http://mg.pov.lt/objgraph/objgraph.html。下面来看使用objgraph的两个简单的例子。其中第一个例子生成对象的引用关系图,第二个显示不同类型对象的数目。

图8-3 对象x的引用关系图

1)生成对象x的引用关系图。生成的关系图如图8-3所示。具体代码如下:

>>> import objgraph
>>> x = ['a','1',[2,3]]
>>> objgraph.show_refs([x],filename='test.png')

2)显示常用类型不同类型对象的数目,限制输出前3行。代码如下:

>>> objgraph.show_most_common_types(limit = 3)
wrapper_descriptor     1031
function           975
builtin_function_or_method 615

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文