【问题标题】:Find out how much memory is being used by an object in Python [duplicate]找出 Python 中的对象正在使用多少内存 [重复]
【发布时间】:2010-09-07 05:34:56
【问题描述】:

您将如何确定一个对象正在使用多少内存?我知道有可能找出一段代码使用了多少,但不是一个实例化的对象(在其生命中的任何时候),这正是我想要的。

【问题讨论】:

标签: python performance memory-profiling


【解决方案1】:

试试这个:

sys.getsizeof(object)

getsizeof() 返回对象的大小(以字节为单位)。它调用对象的__sizeof__ 方法并增加额外的垃圾收集器开销如果对象由垃圾收集器管理。

A recursive recipe

【讨论】:

  • 这个 sys.getsizeof(object) 返回值是否包含实际对象大小而不是上面 fserb 所说的指针大小?
  • 不,它会返回指针的大小。
  • 这和object.__sizeof__()有什么区别? sys.getsizeof(object) 似乎返回了一个稍大的值。编辑:后者还包括垃圾收集器开销。
  • 我发现sys.getsizeof(object.copy) 通常给出正确的值,而sys.getsizeof(object) 给出的值要低得多(我猜是指针大小)。
【解决方案2】:

没有简单的方法可以找出 python 对象的内存大小。您可能会发现的问题之一是 Python 对象(如列表和字典)可能引用了其他 Python 对象(在这种情况下,您的大小是多少?大小是否包含每个对象的大小?)。有一些与对象类型和垃圾收集相关的指针开销和内部结构。最后,一些 python 对象有不明显的行为。例如,大多数情况下,列表会为更多的对象保留空间; dicts 更加复杂,因为它们可以以不同的方式操作(它们对少量的键有不同的实现,有时它们会过度分配条目)。

有一个big chunk of code(和一个updated big chunk of code)试图最好地近似内存中python对象的大小。

您可能还想检查一些 old description about PyObject(代表几乎所有 python 对象的内部 C 结构)。

【讨论】:

  • @culix:现在Pympler 模块中似乎又使用了。
  • 如果您的对象非常简单,例如带有Int -> (Int, Int) 映射的字典怎么办?理论上计算这样一个物体的大小应该很简单吧?
【解决方案3】:

我对以下任何一种都没有任何个人经验,但简单地搜索“Python [memory] ​​profiler”产量:

希望对您有所帮助。

【讨论】:

    【解决方案4】:

    必须小心使用,因为覆盖对象 __sizeof__ 可能会产生误导。

    使用 bregman.suite,一些使用 sys.getsizeof 的测试在对象实例中输出数组对象(数据)的副本,因为它大于对象本身 (mfcc)。

    >>> mfcc = MelFrequencyCepstrum(filepath, params)
    >>> data = mfcc.X[:]
    >>> sys.getsizeof(mfcc)
    64
    >>> sys.getsizeof(mfcc.X)
    >>>80
    >>> sys.getsizeof(data)
    80
    >>> mfcc
    <bregman.features.MelFrequencyCepstrum object at 0x104ad3e90>
    

    【讨论】:

      【解决方案5】:

      对于大物体,您可以使用一种粗略但有效的方法: 检查你的 Python 进程在系统中占用了多少内存,然后删除对象并进行比较。

      这种方法有很多缺点,但它可以让您快速估计非常大的物体。

      【讨论】:

      • 这不太可能有效。进程中释放的内存不必返回给操作系统,因此寻找内存使用量的减少可能并不准确。
      • 在创建对象之前和之后测量python进程资源使用情况的类似方法会非常有效。
      • 不要这么认为 @AntonyHatchkins 作为 python 内存管理器不一定从操作系统获取新内存。在某种程度上,即使没有使用,内存池也会保持分配状态,因此当有新请求时,它可能会被满足,而无需向操作系统请求更多内存。换句话说,这种方法对于对象的创建和销毁都是不可靠的。
      猜你喜欢
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-30
      • 2011-09-06
      • 2015-03-29
      • 1970-01-01
      相关资源
      最近更新 更多