Python2.7有内存分析工具吗?

4

我需要检查在python中使用的对象的内存统计信息。
我找到了guppy和pysizer,但它们不支持python2.7。
有没有适用于python2.7的内存分析器?
如果没有,我自己该怎么做呢?


你真的需要对你的代码进行性能分析吗?只是问一下! - user225312
检查对象的内存统计信息。为什么?你遇到了什么具体问题?是内存不足吗?通常不需要进行分析,很明显哪个对象太大了。请解释一下你实际观察到的问题。 - S.Lott
2
可能是Python内存分析器的重复问题。 - Lennart Regebro
4个回答

2

您可能希望尝试将以下代码调整为适合您特定情况并支持您的数据类型:

import sys


def sizeof(variable):
    def _sizeof(obj, memo):
        address = id(obj)
        if address in memo:
            return 0
        memo.add(address)
        total = sys.getsizeof(obj)
        if obj is None:
            pass
        elif isinstance(obj, (int, float, complex)):
            pass
        elif isinstance(obj, (list, tuple, range)):
            if isinstance(obj, (list, tuple)):
                total += sum(_sizeof(item, memo) for item in obj)
        elif isinstance(obj, str):
            pass
        elif isinstance(obj, (bytes, bytearray, memoryview)):
            if isinstance(obj, memoryview):
                total += _sizeof(obj.obj, memo)
        elif isinstance(obj, (set, frozenset)):
            total += sum(_sizeof(item, memo) for item in obj)
        elif isinstance(obj, dict):
            total += sum(_sizeof(key, memo) + _sizeof(value, memo)
                         for key, value in obj.items())
        elif hasattr(obj, '__slots__'):
            for name in obj.__slots__:
                total += _sizeof(getattr(obj, name, obj), memo)
        elif hasattr(obj, '__dict__'):
            total += _sizeof(obj.__dict__, memo)
        else:
            raise TypeError('could not get size of {!r}'.format(obj))
        return total
    return _sizeof(variable, set())

看起来很有前途,但我认为你应该将其更改为def getsizeof(obj, memo=None):并将memo的初始化移动到函数内部,使用if memo is None: memo = set()。当然,所有对getsizeof()的递归调用也需要交换它们的参数。 - martineau
1
@martineau:承诺不应该轻易地抛给新手。通过所有旧/新,有/无__slots__,单一/多重继承等类的实例处理是一场噩梦。例如,请参见http://code.activestate.com/recipes/546530-size-of-python-objects-revised/,它花费了超过2000 SLOC和多个版本才达到一个未知是否错误的状态。我同意您对“memo”参数的评论。 - John Machin
@John Machin:现在ActiveState的配方已经接近3000行源代码,版本为5.12,因此一般情况显然是一个非常难以解决的问题——这也是我发现@Noctis Skytower的答案有趣的原因之一,因为通常人们并不需要处理每种可能的情况,只需要处理自己的一些情况。希望sys.getsizeof()在未来会有所改进——我实际上从来没有用过它,所以只知道它被添加了,而不知道它所有的缺陷。 - martineau
上面的代码用于查找此搜索算法创建的数据结构的大小:https://dev59.com/HHA75IYBdhLWcg3wipmH#3276775 - Noctis Skytower

2
这是适用于Python 2.7的一个例子:Pympler包

1

我不知道有没有适用于Python 2.7的分析器,但是请查看已添加到sys模块中的以下函数,它可以帮助您自己完成。

"一个新的函数getsizeof(),接受一个Python对象并返回对象使用的内存量(以字节为单位)。内置对象返回正确的结果;第三方扩展可能不会,但可以定义一个__sizeof__()方法来返回对象的大小。"

这里是关于它的在线文档链接:

    Python 2.6的新功能
    27.1. sys模块-系统特定参数和函数


它可能可以,但实际上并不行。sys.getsizeof是“一个陷阱和幻觉”。请阅读这个SO问题,特别是Thomas Wouters的答案:https://dev59.com/vXI95IYBdhLWcg3w3h_G - John Machin
@John Machin:在这种情况下,你认为 @Noctis Skytower 的回答怎么样? - martineau

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接