您如何查明对象使用了多少内存?我知道有可能找出代码块使用了多少,但不是实例化对象(在其生命中的任何时间),这是我想要的。
答案 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)
答案 2 :(得分:41)
另一种方法是使用泡菜。请参阅this answer以获取此问题的副本。
答案 3 :(得分:4)
我对以下任何一种情况都没有任何亲身经验,只是简单搜索“Python [memory] profiler”产量:
PySizer,“Python的内存分析器”,在http://pysizer.8325.org/找到。然而,该页面似乎表明项目暂时没有更新,并且引用了......
Heapy,“支持对Python程序中与内存相关的问题进行调试和优化”,发现于http://guppy-pe.sourceforge.net/#Heapy。
希望有所帮助。
答案 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进程在系统中占用多少内存,然后删除对象并进行比较。
这种方法有许多缺点,但它可以为非常大的物体提供非常快速的估计。