关于性能:了解Python中的对象使用了多少内存

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()调用对象的__sizeof__方法,如果对象由垃圾收集器管理,则会添加额外的垃圾收集器开销。

递归配方


另一种方法是使用泡菜。请参阅此问题副本的答案。


我对以下任何一项都没有任何个人经验,但只需简单搜索"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进程在系统中占用了多少内存,然后删除该对象并进行比较。

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