我想知道我的Python应用程序的内存使用情况,特别是想知道哪些代码块/部分或对象消耗的内存最多。 谷歌搜索显示一个商业的是Python内存验证器(仅Windows)。
开源的有PySizer和Heapy。
我还没有试过,所以我想知道哪一个是最好的,因为:
给出了大部分细节。 我必须对代码做最少或不做任何更改。
我想知道我的Python应用程序的内存使用情况,特别是想知道哪些代码块/部分或对象消耗的内存最多。 谷歌搜索显示一个商业的是Python内存验证器(仅Windows)。
开源的有PySizer和Heapy。
我还没有试过,所以我想知道哪一个是最好的,因为:
给出了大部分细节。 我必须对代码做最少或不做任何更改。
当前回答
考虑objgraph库(参见这篇博客文章中的示例用例)。
其他回答
我推荐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。我很感激别人的评价。
更新
上面的代码是针对CherryPy 2的。X, CherryPyX服务器。快速启动方法已删除和引擎。Start不带阻塞标志。如果你用的是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()
Guppy3使用起来非常简单。在代码中的某些地方,你必须写以下代码:
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编写的。
对于Python 2。x,使用Heapy。
我发现meliae比Heapy或PySizer更有功能。如果你碰巧在运行一个wsgi webapp,那么Dozer是一个很好的Dowser中间件包装器
我正在为Python开发一个名为memprof的内存分析器:
http://jmdana.github.io/memprof/
它允许您在执行装饰方法期间记录和绘制变量的内存使用情况。你只需要导入库使用:
from memprof import memprof
并装饰你的方法使用:
@memprof
这是一个关于图的例子:
该项目托管在GitHub:
https://github.com/jmdana/memprof
我的模块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