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

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

242885 次浏览

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

希望这能有所帮助。

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

有一个一大块代码(和一个更新了一大块代码)试图最好地近似内存中的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进程在系统中占用了多少内存,然后删除该对象并进行比较

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