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

时间:2020-03-06 14:30:00  来源:igfitidea点击:

我想知道我的Python应用程序的内存使用情况,尤其想知道哪些代码块/部分或者对象消耗了最多的内存。
Google搜索显示商用的是Python Memory Validator(仅限Windows)。

开源的是PySizer和Heapy。

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

  • 提供大多数细节。
  • 我不必对代码进行最少的更改,也可以不做任何更改。

解决方案

我推荐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"," CherryPy 3.X"," server.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()

堆很容易使用。在代码中的某些时候,我们必须编写以下代码:

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编写的图形浏览器。

考虑objgraph库(有关示例使用案例,请参见http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks)。