Find out how much memory is being used by an object in Python
你将如何找出一个对象使用了多少内存?我知道有可能知道一块代码使用了多少,但不知道一个实例化对象(在其生命周期中的任何时候)使用了多少,这正是我想要的。
要找出一个python对象的内存大小是不容易的。您可能会发现的一个问题是,python对象(如list和dict)可能引用了其他的python对象(在本例中,您的大小是多少)?是否包含每个对象的大小?)。存在一些与对象类型和垃圾收集相关的指针开销和内部结构。最后,一些Python对象具有不明显的行为。例如,在大多数情况下,列表为更多对象预留空间;dict甚至更复杂,因为它们可以以不同的方式操作(它们对少量键有不同的实现,有时它们会过度分配条目)。
这里有一大块代码(以及一大块更新后的代码),以尽量接近内存中Python对象的大小。
您可能还需要检查关于pyobject(实际上表示所有python对象的内部C结构)的一些旧描述。
试试这个:
1 | sys.getsizeof(object) |
getsizeof()调用对象的
递归配方
另一种方法是使用泡菜。请参阅此问题副本的答案。
我对以下任何一项都没有任何个人经验,但只需简单搜索"python[内存]分析器"即可:
pysizer,"一个针对python的内存分析器",可以在http://pysizer.8325.org/上找到。然而,页面似乎表明该项目已经有一段时间没有更新了,并且引用了…
heapy,"支持在python程序中调试和优化内存相关问题",可在http://guppy pe.sourceforge.net/heapy找到。
希望有帮助。
必须小心使用,因为对象的覆盖可能会误导用户。
使用bregman.suite,一些使用sys.getsizeof的测试将对象实例中数组对象(数据)的副本输出为大于对象本身(mfcc)。
1 2 3 4 5 6 7 8 9 10 | >>> 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进程在系统中占用了多少内存,然后删除该对象并进行比较。
这个方法有很多缺点,但它会给你一个非常大的物体非常快速的估计。