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


我没有任何个人经验,以下任何一个,但一个简单的搜索“Python[内存]分析器”得到:

PySizer,“Python内存分析器”,可以在http://pysizer.8325.org/找到。然而,该页面似乎表明该项目已经有一段时间没有更新了,并引用… Heapy,“支持Python程序中内存相关问题的调试和优化”,可以在http://guppy-pe.sourceforge.net/#Heapy上找到。

希望这能有所帮助。


There's no easy way to find out the memory size of a python object. One of the problems you may find is that Python objects - like lists and dicts - may have references to other python objects (in this case, what would your size be? The size containing the size of each object or not?). There are some pointers overhead and internal structures related to object types and garbage collection. Finally, some python objects have non-obvious behaviors. For instance, lists reserve space for more objects than they have, most of the time; dicts are even more complicated since they can operate in different ways (they have a different implementation for small number of keys and sometimes they over allocate entries).

有一大块代码(以及一大块更新后的代码)试图最好地近似内存中的python对象的大小。

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


试试这个:

sys.getsizeof(object)

getsizeof()返回一个对象的字节大小。它调用对象的__sizeof__方法,如果对象由垃圾收集器管理,则会增加额外的垃圾收集器开销。

递归配方


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

使用bregman。套件,一些测试与系统。Getsizeof在对象实例中输出一个数组对象(data)的副本,该副本大于对象本身(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进程在系统中占用了多少内存,然后删除该对象并进行比较。

这种方法有很多缺点,但它会给你一个非常快速的估计非常大的对象。