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

时间:2008-08-29 04:59:31

标签: python performance memory-profiling

您如何查明对象使用了多少内存?我知道有可能找出代码块使用了多少,但不是实例化对象(在其生命中的任何时间),这是我想要的。

6 个答案:

答案 0 :(得分:95)

找不到python对象的内存大小没有简单的方法。你可能会发现的一个问题是Python对象 - 比如列表和dicts - 可能引用了其他python对象(在这种情况下,你的大小是什么?包含每个对象大小的大小?)。有一些指针开销和与对象类型和垃圾收集相关的内部结构。最后,一些python对象具有非显而易见的行为。例如,列出大多数时间为更多对象预留空间; dicts更复杂,因为它们可以以不同的方式运行(它们对于少量密钥有不同的实现,有时它们会分配条目)。

有一个big chunk of code(以及一个updated big chunk of code)来尝试最好地估计内存中python对象的大小。

您可能还想检查一些old description about PyObject(几乎所有python对象的内部C结构)。

答案 1 :(得分:94)

试试这个:

sys.getsizeof(object)

getsizeof()调用对象的__sizeof__方法并添加额外的垃圾收集器开销如果该对象由垃圾收集器管理。

A recursive recipe

答案 2 :(得分:41)

另一种方法是使用泡菜。请参阅this answer以获取此问题的副本。

答案 3 :(得分:4)

我对以下任何一种情况都没有任何亲身经验,只是简单搜索“Python [memory] ​​profiler”产量:

希望有所帮助。

答案 4 :(得分:3)

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

使用bregman.suite,sys.getsizeof的一些测试输出对象实例中数组对象(数据)的副本,使其大于对象本身(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>

答案 5 :(得分:-3)

对于大型物体,您可以使用一种粗略但有效的方法: 检查Python进程在系统中占用多少内存,然后删除对象并进行比较。

这种方法有许多缺点,但它可以为非常大的物体提供非常快速的估计。