第十七章:运行时特性-sys:系统特定配置-内存管理和限制-对象大小

it2022-05-09  19

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


最新回复(0)