当前位置:  开发笔记 > 编程语言 > 正文

建议使用哪种Python内存分析器?

如何解决《建议使用哪种Python内存分析器?》经验,为你挑选了8个好方法。

我想知道我的Python应用程序的内存使用情况,并且特别想知道哪些代码块/部分或对象占用了大部分内存.Google搜索显示商业广告是Python Memory Validator(仅限Windows).

开源的是PySizer和Heapy.

我没有尝试任何人,所以我想知道哪一个是最好的考虑:

    提供大部分细节.

    我必须对代码进行最少或不做任何更改.

Fabian Pedre.. 350

由于没有人提到它,我将指向我的模块memory_profiler,它能够打印内存使用的逐行报告,并且可以在Unix和Windows上运行(最后一个需要psutil).输出不是很详细,但目标是概述代码消耗更多内存的位置,而不是对分配的对象进行详尽的分析.

@profile使用-m memory_profiler标志装饰代码并运行代码后,它将打印逐行报告,如下所示:

Line #    Mem usage  Increment   Line Contents
==============================================
     3                           @profile
     4      5.97 MB    0.00 MB   def my_func():
     5     13.61 MB    7.64 MB       a = [1] * (10 ** 6)
     6    166.20 MB  152.59 MB       b = [2] * (2 * 10 ** 7)
     7     13.61 MB -152.59 MB       del b
     8     13.61 MB    0.00 MB       return a

我发现memory_profiler非常简单易用.我想要每行进行性能分析而不是每个对象.谢谢你的写作. (7认同)

它仅在尝试报告逐行数量并且找到重复行时才隐式识别循环.在这种情况下,它将只占用所有迭代的最大值. (3认同)


Torsten Mare.. 278

Heapy使用起来非常简单.在代码中的某个时刻,您必须编写以下内容:

from guppy import hpy
h = hpy()
print h.heap()

这给你一些像这样的输出:

Partition of a set of 132527 objects. Total size = 8301532 bytes.
Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
0  35144  27  2140412  26   2140412  26 str
1  38397  29  1309020  16   3449432  42 tuple
2    530   0   739856   9   4189288  50 dict (no owner)

您还可以找出引用对象的位置并获取有关该对象的统计信息,但不知何故,文档上的文档有点稀疏.

还有一个用Tk编写的图形浏览器.



1> Fabian Pedre..:

由于没有人提到它,我将指向我的模块memory_profiler,它能够打印内存使用的逐行报告,并且可以在Unix和Windows上运行(最后一个需要psutil).输出不是很详细,但目标是概述代码消耗更多内存的位置,而不是对分配的对象进行详尽的分析.

@profile使用-m memory_profiler标志装饰代码并运行代码后,它将打印逐行报告,如下所示:

Line #    Mem usage  Increment   Line Contents
==============================================
     3                           @profile
     4      5.97 MB    0.00 MB   def my_func():
     5     13.61 MB    7.64 MB       a = [1] * (10 ** 6)
     6    166.20 MB  152.59 MB       b = [2] * (2 * 10 ** 7)
     7     13.61 MB -152.59 MB       del b
     8     13.61 MB    0.00 MB       return a


我发现memory_profiler非常简单易用.我想要每行进行性能分析而不是每个对象.谢谢你的写作.
它仅在尝试报告逐行数量并且找到重复行时才隐式识别循环.在这种情况下,它将只占用所有迭代的最大值.

2> Torsten Mare..:

Heapy使用起来非常简单.在代码中的某个时刻,您必须编写以下内容:

from guppy import hpy
h = hpy()
print h.heap()

这给你一些像这样的输出:

Partition of a set of 132527 objects. Total size = 8301532 bytes.
Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
0  35144  27  2140412  26   2140412  26 str
1  38397  29  1309020  16   3449432  42 tuple
2    530   0   739856   9   4189288  50 dict (no owner)

您还可以找出引用对象的位置并获取有关该对象的统计信息,但不知何故,文档上的文档有点稀疏.

还有一个用Tk编写的图形浏览器.


截至2014-07-06,guppy不支持Python 3.
庞大的文档......不好.但我发现这篇博文非常有助于入门:http://www.smira.ru/wp-content/uploads/2011/08/heapy.html
如果您使用的是Python 2.7,则可能需要它的主干版本:http://sourceforge.net/tracker/?func = enter&aid = 3047282&group_id = 105577 &atid = 641821,`pip install https://guppy-pe.svn. sourceforge.net/svnroot /孔雀-PE /中继/ guppy`
注意,heapy不包括在python扩展中分配的内存.如果有人制定了一个机制来获取包含`boost :: python`对象的堆,那么看一些例子会很高兴!
可悲的是似乎没有在osx中​​构建或安装。至少10.4。

3> sanxiyn..:

我推荐Dowser.它很容易设置,您只需对代码进行零更改.您可以通过简单的Web界面查看每种类型的对象的计数,查看活动对象列表,查看活动对象的引用.

# memdebug.py

import cherrypy
import dowser

def start(port):
    cherrypy.tree.mount(dowser.Root())
    cherrypy.config.update({
        'environment': 'embedded',
        'server.socket_port': port
    })
    cherrypy.server.quickstart()
    cherrypy.engine.start(blocking=False)

导入memdebug,并调用memdebug.start.就这样.

我没有尝试过PySizer或Heapy.我会很感激别人的评论.

UPDATE

上面的代码是for CherryPy 2.X,CherryPy 3.Xserver.quickstart方法已被删除,engine.start并没有采取blocking标志.所以,如果你正在使用CherryPy 3.X

# memdebug.py

import cherrypy
import dowser

def start(port):
    cherrypy.tree.mount(dowser.Root())
    cherrypy.config.update({
        'environment': 'embedded',
        'server.socket_port': port
    })
    cherrypy.engine.start()


它不适用于CherryPy.将CherryPy视为GUI工具包.
有一个名为Dozer的通用WSGI端口,也可以与其他Web服务器一起使用:pypi.python.org/pypi/Dozer
但它是否仅适用于樱桃,如何使用它与sinple脚本?
cherrypy 3.1删除了cherrypy.server.quickstart(),所以只需使用cherrypy.engine.start()

4> Charles Duff..:

考虑objgraph库(参见http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks示例用例).


objgraph帮助我解决了我今天面临的内存泄漏问题.objgraph.show_growth()特别有用

5> Serrano..:

Muppy是(又一个)Python的内存使用分析器.该工具集的重点是识别内存泄漏.

Muppy试图帮助开发人员识别Python应用程序的内存泄漏.它可以在运行时跟踪内存使用情况,并识别泄漏的对象.另外,提供了允许定位未释放对象的源的工具.



6> 小智..:

我发现meliae比Heapy或PySizer功能更强大.如果您正在运行wsgi webapp,那么Dozer是Dowser的一个不错的中间件包装器



7> 小智..:

我正在为Python开发一个名为memprof的内存分析器:

http://jmdana.github.io/memprof/

它允许您在执行装饰方法期间记录和绘制变量的内存使用情况.您只需使用以下方法导入库:

from memprof import memprof

并使用以下方法装饰您的方法:

@memprof

这是一个关于图形如何的示例:

在此输入图像描述

该项目在GitHub中托管:

https://github.com/jmdana/memprof


我该如何使用它?什么是a,b,c?

8> haypo..:

还可以尝试pytracemalloc项目,该项目提供每个Python行号的内存使用量.

编辑(2014/04):它现在有一个Qt GUI来分析快照.


`tracemalloc`现在是python标准库的一部分.请参阅https://docs.python.org/3/library/tracemalloc.html
推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有