关于性能:推荐使用哪种Python内存分析器?

Which Python memory profiler is recommended?

我想知道我的python应用程序的内存使用情况,特别想知道哪些代码块/部分或对象占用了大部分内存。谷歌搜索显示一个商业版本是python内存验证器(仅限Windows)。

开源的是pysizer和heapy。

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

  • 给出了大部分细节。

  • 我必须对我的代码做最少或不做任何更改。


  • 由于没有人提到它,我将指向我的模块内存_profiler,它能够打印内存使用情况的逐行报告,并在Unix和Windows上工作(最后一个需要psutil)。输出不是很详细,但目的是让您大致了解代码在哪里消耗了更多的内存,而不是对分配的对象进行详尽的分析。

    在用@profile修饰函数并使用-m memory_profiler标志运行代码之后,它将按如下方式逐行打印报告:

    1
    2
    3
    4
    5
    6
    7
    8
    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


    Heapy很容易使用。在代码中的某个时刻,您必须编写以下内容:

    1
    2
    3
    from guppy import hpy
    h = hpy()
    print h.heap()

    这会给您一些这样的输出:

    1
    2
    3
    4
    5
    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编写。


    我推荐嫁妆。它非常容易设置,并且您需要对代码进行零更改。您可以通过时间查看每种类型的对象计数、查看活动对象列表、查看对活动对象的引用,所有这些都可以通过简单的Web界面查看。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # 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.X的,server.quickstart方法已被删除,engine.start不取blocking标志。所以如果你用的是CherryPy 3.X

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 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()


    考虑a href="http://mg.pov.lt/objgraph/"rel="noreferrer">objgraph/aa库(请参阅a href="http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks"rel="noreferrer">http://www.lshift.net/blog/2008/11/14/tracing python memory leaks/aa示例用例)。


    muppy是另一个针对python的内存使用状况分析器。这个工具集的重点放在识别内存泄漏上。

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


    我发现Meliae比Heapy或Pysizer更实用。如果您碰巧运行一个wsgi webapp,那么Dozer是Dowser的一个很好的中间件包装器。


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

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

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

    1
    from memprof import memprof

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

    1
    @memprof

    这是一个关于图形外观的示例:

    enter image description here

    该项目托管在Github中:

    网址:https://github.com/jmdana/memprof


    还可以尝试pytracemalloc项目,该项目提供每个python行号的内存使用情况。

    编辑(2014/04):它现在有一个QtGUI来分析快照。