performance - Python内存探查器的建议?

  显示原文与译文双语对照的内容

我想知道我的python 应用程序的内存使用情况,特别想知道哪些代码块或者对象消耗了大部分内存。 谷歌搜索显示一个商业的python 内存验证程序

开放源代码是 PySizerHeapy 。

我没有尝试过,所以我想知道哪一个是最好的:

  1. 提供大多数细节。

  2. 我必须至少对代码进行更改或者不更改。

时间:

Heapy web 使用起来非常简单。 在代码的某一点上,你必须编写以下内容:


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)

在那个有点sparse,从被引用并获得统计信息有关该物件的地方,但是为什么你还可以得知 docs.

还有一个图形化浏览器,用Tk编写。

由于没有人提到它,我将指向我的模块 memory_profiler,它能够打印内存使用的line-by-line报告并在Unix和 Windows ( 在最后一次需要 psutil ) 上运行。 输出并不是非常详细,但目标是给你一个关于代码消耗更多内存的概述,而不是对已经分配对象的详尽分析。

使用 @profile 装饰你的函数并使用 -m memory_profiler 标志运行代码后,它将打印如下的line-by-line报告:


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

我推荐 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.XCherryPy 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()

我发现 meliae的功能比Heapy或者PySizer更多功能。 如果你碰巧运行 wsgi web services,那么推土机是Dowser的一个不错的中间件包装器

...