Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
建议使用哪种Python内存分析器?_Python_Performance_Memory Management_Profiling - Fatal编程技术网

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

建议使用哪种Python内存分析器?,python,performance,memory-management,profiling,Python,Performance,Memory Management,Profiling,我想知道Python应用程序的内存使用情况,特别想知道哪些代码块/部分或对象消耗了最多内存。 谷歌搜索显示一个商业软件是(仅限Windows) 开源的是和 我没有试过任何人,所以我想知道哪一个是最好的: 提供了大部分细节 我必须对我的代码做最少的更改,或者不做任何更改 我推荐。这是非常容易设置,你需要零更改您的代码。您可以通过简单的web界面查看每种类型对象的时间计数、查看活动对象列表、查看对活动对象的引用 # memdebug.py import cherrypy import dowser

我想知道Python应用程序的内存使用情况,特别想知道哪些代码块/部分或对象消耗了最多内存。 谷歌搜索显示一个商业软件是(仅限Windows)

开源的是和

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

  • 提供了大部分细节

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

  • 我推荐。这是非常容易设置,你需要零更改您的代码。您可以通过简单的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
    服务器。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.carstensen
    a
    b
    c
    是变量的名称。您可以在上找到文档。如果您有任何问题,请随时在github中提交问题或向文档中的邮件列表发送电子邮件