找出在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”得出:
-
PySizer是“Python的内存分析器”,可在http://pysizer.8325.org/上find。; 但是,该页面似乎表明该项目尚未更新一段时间,并提到…
-
Heapy“在Python程序中支持与内存相关的问题的debugging和优化,”在http://guppy-pe.sourceforge.net/#Heapy上发现。;
希望有所帮助。
这必须谨慎使用,因为__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内存,然后删除对象并进行比较。
这种方法有许多缺点,但它会给你非常快的估计非常大的物体。