找出在Python中有多less内存被一个对象使用

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

没有简单的方法来找出python对象的内存大小 。 你可能发现的一个问题是,Python对象(如列表和字典)可能会引用其他python对象(在这种情况下,你的大小是多less?包含每个对象大小的大小?)。 有一些与对象types和垃圾收集有关的指针开销和内部结构。 最后,一些python对象有不明显的行为。 例如,大多数情况下列出的空间要比他们拥有的物品多; 字典更复杂,因为它们可以以不同的方式操作(它们对于less量的密钥有不同的实现方式,有时甚至超过分配的条目)。

有一大块代码 (和更新的大块代码 )在那里试图最好地接近内存中的python对象的大小。 还有一些更简单的近似值 。 但他们将永远是近似值。

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

尝试这个:

 sys.getsizeof(object) 

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

一个recursion的食谱

另一种方法是使用泡菜。 看到这个答案重复这个问题。

我对以下任何一种都没有任何个人经验,只是简单地search一下“Python [memory] ​​profiler”得出:

希望有所帮助。

这必须谨慎使用,因为__sizeof__对象的覆盖可能会引起误解。

使用bregman.suite,一些使用sys.getsizeof的testing会将对象实例中的数组对象(数据)的副本输出为大于对象本身(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> 

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

这种方法有许多缺点,但它会给你非常快的估计非常大的物体。