您将如何找出一个对象正在使用多少内存?我知道有可能找出一段代码使用了多少,但不是一个实例化的对象(在其生命中的任何时候),这正是我想要的。
5 回答
试试这个:
sys.getsizeof(object)
getsizeof()返回对象的大小(以字节为单位)。如果对象由垃圾收集器管理,它会调用对象的__sizeof__
方法并增加额外的垃圾收集器开销。
没有简单的方法可以找出 python 对象的内存大小。您可能会发现的问题之一是 Python 对象(如列表和字典)可能引用了其他 Python 对象(在这种情况下,您的大小是多少?大小是否包含每个对象的大小?)。有一些与对象类型和垃圾收集相关的指针开销和内部结构。最后,一些 python 对象有不明显的行为。例如,大多数情况下,列表会为更多的对象保留空间;dicts 更加复杂,因为它们可以以不同的方式操作(它们对少量的键有不同的实现,有时它们会过度分配条目)。
有一大块代码(和更新的一大块代码)试图最好地近似内存中 python 对象的大小。
您可能还想查看一些关于 PyObject(代表几乎所有 python 对象的内部 C 结构)的旧描述。
我对以下任何一种都没有任何个人经验,但简单地搜索“Python [memory] profiler”产量:
PySizer,“Python 的内存分析器”,位于http://pysizer.8325.org/。但是该页面似乎表明该项目已经有一段时间没有更新了,并指...
Heapy,“支持[ing]调试和优化 Python 程序中与内存相关的问题”,位于http://guppy-pe.sourceforge.net/#Heapy。
希望有帮助。
这必须小心使用,因为对象 __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>
对于大对象,你可能会使用一种有点粗略但有效的方法:检查你的 Python 进程在系统中占用了多少内存,然后删除该对象并进行比较。
这种方法有很多缺点,但它会给你一个非常大的物体非常快速的估计。