建议使用哪种Python内存分析器?
我想知道Python应用程序的内存使用情况,特别想知道哪些代码块/部分或对象消耗了最多内存。 谷歌搜索显示一个商业软件是(仅限Windows) 开源的是和 我没有试过任何人,所以我想知道哪一个是最好的:建议使用哪种Python内存分析器?,python,performance,memory-management,profiling,Python,Performance,Memory Management,Profiling,我想知道Python应用程序的内存使用情况,特别想知道哪些代码块/部分或对象消耗了最多内存。 谷歌搜索显示一个商业软件是(仅限Windows) 开源的是和 我没有试过任何人,所以我想知道哪一个是最好的: 提供了大部分细节 我必须对我的代码做最少的更改,或者不做任何更改 我推荐。这是非常容易设置,你需要零更改您的代码。您可以通过简单的web界面查看每种类型对象的时间计数、查看活动对象列表、查看对活动对象的引用 # memdebug.py import cherrypy import dowser
# 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。我会感谢其他人的评论
更新
上述代码用于CherryPy 2.X
,CherryPy 3.X
服务器。quickstart方法已被删除,引擎。start
不使用阻塞
标志。因此,如果您使用的是cherrypy3.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()
使用起来很简单。在代码中的某个时刻,您必须编写以下代码:
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)
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
您还可以从引用对象的位置找到这些对象,并获得相关的统计信息,但不知何故,这些对象上的文档有点稀疏
还有一个用Tk编写的图形浏览器
对于Python2.x,请使用。考虑该库(请参见示例用例)。我发现它比Heapy或PySizer功能更强。如果您碰巧正在运行wsgi webapp,那么Dowser是一个很好的中间件包装器我的模块能够逐行打印内存使用情况报告,并且可以在Unix和Windows上运行(最后一个模块需要psutil)。输出不是很详细,但目标是让您概括代码消耗更多内存的位置,而不是对分配的对象进行详尽的分析
使用@profile
装饰函数并使用-m memory\u profiler
标记运行代码后,它将按如下方式逐行打印报告:
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)
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
是Python的(又一个)内存使用探查器。此工具集的重点是识别内存泄漏
Muppy试图帮助开发人员识别Python应用程序的内存泄漏。它支持在运行时跟踪内存使用情况并识别泄漏的对象。此外,还提供了一些工具来定位未发布对象的源。我正在为Python开发一个名为memprof的内存分析器: 它允许您在执行修饰方法期间记录和绘制变量的内存使用情况。您只需使用以下方法导入库:
from memprof import memprof
并使用以下方法装饰您的方法:
@memprof
这是一个关于曲线图的示例:
该项目位于GitHub中:
还可以尝试提供每个Python行号的内存使用情况
编辑(2014/04):它现在有一个Qt GUI来分析快照。但它只适用于cherrypy,如何将它与sinple脚本一起使用?它不适用于cherrypy。把CherryPy想象成一个GUI工具包。Dowser有一个通用的WSGI端口,叫做Dozer,您也可以将它用于其他web服务器:pypi.python.org/pypi/Dozercherrypy 3.1删除了CherryPy.server.quickstart(),所以只需使用CherryPy.engine.start(),这在python 3中不起作用。我发现了一个明显的StringIO错误。如果您使用的是Python 2.7,您可能需要它的主干版本:,
pip安装https://guppy-pe.svn.sourceforge.net/svnroot/guppy-pe/trunk/guppy
heapy文档是。。。不好的。但我发现这篇博文对入门非常有帮助:注意,heapy不包括python扩展中分配的内存。如果有人已经设计出一种机制来让heapy包含boost::python
对象,那么很高兴看到一些示例!截至2014-07-06,guppy不支持Python 3。guppy的一个分支支持Python 3,名为guppy3。objgraph帮助我解决了我今天面临的内存泄漏问题。show_growth()特别有用,我也发现objgraph非常有用。您可以按类型('dict')执行类似于objgraph
了解所有这些意外的dict
对象来自何处。要查找泄漏源,我建议使用objgraph。@MikeiLL有一个地方可以问这样的问题:这种情况经常发生,我们应该能够将一个问题迁移到另一个论坛。提示:如果有人使用gae to并希望检查内存使用情况——这是一个非常头痛的问题,因为这些工具没有输出任何内容或事件没有启动。如果您想测试一些小的东西,请将要测试的函数移动到单独的文件中,并单独运行此文件。我推荐使用我的用例—一个简单的图像处理脚本,而不是一个复杂的系统,它恰好打开了一些游标—这是最好的解决方案。非常简单,只需在代码中添加最少的gunk,就可以访问并了解发生了什么。非常适合快速修复,也可能非常适合其他应用程序。我发现memory_profiler非常简单且易于使用。我想按行而不是按对象进行分析。感谢您的写作。@FabianPedregosa memory_profiler如何处理循环,它能识别循环迭代数吗?它仅在尝试逐行报告数量并找到重复的行时隐式标识循环。在这种情况下,它只需要所有迭代的最大值。在CPU密集型程序中,它的性能似乎不是很好。我使用它吗?什么是a,b,c?@tommy.carstensena
,b
和c
是变量的名称。您可以在上找到文档。如果您有任何问题,请随时在github中提交问题或向文档中的邮件列表发送电子邮件