17.2.3.2 对象大小
了解一个对象有多少引用可以帮助开发人员发现环或内存泄漏,不过还不足以确定哪些对象消耗的内存最多。这需要知道对象有多大。
import sys
class MyClass:
pass
objects= [
[],(),{},'c','string',b'bytes',1,2.3,
MyClass,MyClass(),
]
for obj in objects:
print('{:>10}:{}'.format(type(obj).__name__,
sys.getsizeof(obj)))
getsizeof()会报告一个对象的大小(单位为字节)。
报告的定制类大小不包括属性值的大小。
import sys
class WithoutAttributes:
pass
class WithAttributes:
def __init__(self):
self.a = 'a'
self.b = 'b'
return
without_attrs = WithoutAttributes()
print('WithoutAttributes:',sys.getsizeof(without_attrs))
with_attrs = WithAttributes()
print('WithAttributes:',sys.getsizeof(with_attrs))
这可能会让人对实际消耗的内存量有一个错误的印象。
对于一个类所用的空间,为了得到更全面的估计,这个模块提供了一个__sizeof__()方法来计算这个值,它会累计一个对象各个属性的大小。
import sys
class WithAttributes:
def __init__(self):
self.a = 'a'
self.b = 'b'
return
def __sizeof__(self):
return object.__sizeof__(self) + \
sum(sys.getsizeof(v) for v in self.__dict__.values())
my_inst = WithAttributes()
print(sys.getsizeof(my_inst))
这个版本在计算对象大小时,会在对象基本大小的基础上加上存储在内部__dict__中的所有属性的大小。
运行结果:
156