Python中sys包有一个函数getsizeof能够返回对象的”大小“。例如
根据Python文档,这个函数能够正确计算内建类型的对象的内存占用大小。但是对于其他的类型,就不确定了。因为sys.getsizeof计算对象大小时,会考虑自定义类的__sizeof__方法,然后加上GC所需的额外部分。下面代码的例子清晰地显示了实现了__sizeof__方法的类的大小。
import sys
class MyBucket:
def __init__(self):
pass
def __sizeof__(self):
return 1000
class MyNoopClass:
pass
class MyPlainClass:
name = "plain object"
def __init__(self):
self.x = 100
self.y = 200
if __name__ == '__main__':
bucket = MyBucket()
print(f"bucket.__sizeof__ is {bucket.__sizeof__()}")
print(f"sys.getsizeof(bucket) is {sys.getsizeof(bucket)}")
noop = MyNoopClass()
print(f"noop.__sizeof__ is {noop.__sizeof__()}")
print(f"sys.getsizeof(noop) is {sys.getsizeof(noop)}")
plain = MyPlainClass()
print(f"plain.__sizeof__ is {plain.__sizeof__()}")
print(f"sys.getsizeof(plain) is {sys.getsizeof(plain)}")
输出结果为:
bucket.__sizeof__ is 1000
sys.getsizeof(bucket) is 1016
noop.__sizeof__ is 32
sys.getsizeof(noop) is 48
plain.__sizeof__ is 32
sys.getsizeof(plain) is 48
需要注意的是,这里的对象大小的计算只涉及到对象自身占用的内存,而不会计算它引用的对象。
另外对于复杂对象,可以参考这个代码实现。Compute Memory footprint of an object and its contents « Python recipes « ActiveState Codehttps://code.activestate.com/recipes/577504/