【问题标题】:Is there a memory profiler for python2.7?python2.7有内存分析器吗?
【发布时间】:2011-05-23 22:22:23
【问题描述】:

我需要检查我在 python 中使用的对象的内存统计信息。
我遇到了 guppy 和 pysizer,但它们不适用于 python2.7。
是否有可用于 python 2.7 的内存分析器?
如果没有,我可以自己做吗?

【问题讨论】:

  • 真的需要分析您的代码吗?只是问问!
  • "检查对象的内存统计" 为什么?您遇到了什么具体问题?记不清?分析通常不是必需的,通常很明显哪个对象太大了。请说明您实际观察到的问题。
  • Python memory profiler的可能重复

标签: python memory profiler


【解决方案1】:

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

“一个新函数getsizeof() Python 对象并返回金额 对象使用的内存,测量 以字节为单位。内置对象返回 正确的结果;第三者 扩展可能没有,但可以定义一个 __sizeof__() 方法返回对象的大小。”

以下是在线文档中相关信息的链接:

    What’s New in Python 2.6
27.1. sys module — System-specific parameters and functions

【讨论】:

  • 可以,但不能。 sys.getsizeof 是“圈套和妄想”。阅读这个 SO 问题,特别是 Thomas Wouters 的回答:stackoverflow.com/questions/2117255
  • @John Machin:那你觉得@Noctis Skytower 的回答怎么样?
【解决方案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:一个不应该随便扔在新手路上的承诺。通过旧/新的所有复杂性处理类的实例,有/没有__slots__,无/单/多继承等是一场噩梦。例如,参见code.activestate.com/recipes/…,它花费了 2000 多个 SLOC 和多个版本以使其进入未知错误状态。我同意您对memo arg 的评论。
  • @John Machin:activestate 配方现在接近 3000 行源代码并且是 5.12 版,所以一般情况显然是一个很难破解的鸡蛋 - 这是我找到 @ 的原因之一Noctis Skytower 的回答很有趣,因为通常不需要一个工具来处理所有可能的情况,只需要他们自己的几个。希望sys.getsizeof() 将来会有所改进——我从来没有真正需要它,所以只知道它已被添加,而不是它的所有缺陷。
  • 上面的代码用于查找此搜索算法创建的数据结构的大小:stackoverflow.com/questions/3242597/…
【解决方案3】:

这是适用于 Python 2.7 的一个:The Pympler package

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    相关资源
    最近更新 更多