找出Python中对象使用了多少内存

dwe*_*ook 195 python performance memory-profiling

你将如何找出一个对象使用了多少内存?我知道有可能找出代码块使用了多少,但不是实例化对象(在其生命中的任何时间),这就是我想要的.

Uze*_*zer 106

试试这个:

sys.getsizeof(object)
Run Code Online (Sandbox Code Playgroud)

如果对象由垃圾收集器管理,则getsizeof()调用对象的__sizeof__方法并添加额外的垃圾收集器开销.

递归食谱

  • 不,它将返回指针的大小. (7认同)
  • 这和`object.__sizeof__()`有什么区别?似乎`sys.getsizeof(object)` 返回一个稍大的值。编辑:后者还包括垃圾收集器开销。 (6认同)
  • 这个sys.getsizeof(对象)返回值是否包含真实对象大小而不是指针的大小,如上所述fserb? (4认同)
  • 这是不对的。我在CPU中创建了一个pytorch张量,其形状为“(100000000,)”,“sys.getsizeof(x.copy)”显示80。但数据类型是float64。 (3认同)

fse*_*erb 102

找不到python对象的内存大小是没有简单的方法.你可能会发现的一个问题是Python对象 - 比如列表和dicts - 可能引用了其他python对象(在这种情况下,你的大小是什么?包含每个对象大小的大小?).有一些指针开销和与对象类型和垃圾收集相关的内部结构.最后,一些python对象具有非显而易见的行为.例如,列出大多数时间为更多对象预留空间; dicts甚至更复杂,因为它们可以以不同的方式操作(它们对于少量密钥具有不同的实现,并且有时它们超过分配条目).

有一大块代码(以及更新的大块代码)在那里试图最好地估计内存中python对象的大小.

您可能还想查看一些关于PyObject的旧描述(几乎所有python对象的内部C结构).

  • @culix:现在再次使用[Pympler](http://pythonhosted.org/Pympler/)模块. (6认同)
  • 如果您的对象非常简单,例如带有 `Int -> (Int, Int)` 映射的 dict,该怎么办?理论上,计算这样一个对象的大小应该很简单吧? (2认同)
  • 如果一本书引用了其他书籍,它的大小就不会增加。 (2认同)

dre*_*cko 45

另一种方法是使用泡菜.请参阅此答案以获得此问题的副本.

  • 这是一种非常明智的*和*简单的方法. (7认同)

小智 7

我对以下任一方面都没有任何个人经验,但对“Python [内存] 分析器”的简单搜索结果如下:

希望有帮助。


raf*_*lle 6

这必须小心使用,因为对对象 __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>
Run Code Online (Sandbox Code Playgroud)