为了寻找减少python内存使用的方法,我创建了以下代码
from pympler.asizeof import asizeof
class Reduce(type):
def __new__(cls, name, bases, attrs):
attrs['__dict__'] = {}
return super().__new__(cls, name, bases, attrs)
class WithReduce(metaclass=Reduce):
def __init__(self):
self.a = 1
class Normal:
def __init__(self):
self.a = 1
print(asizeof(WithReduce())) # 122
print(asizeof(Normal())) # 240
排除元类中的__dict__
内容,我能够将类的内存使用减少近50%
在一些测试中,我意识到,当在WithReduce
中添加新属性时,它们不会占用内存空间,也不会存储在__dict__
中。然而,在Normal
中,它们占用内存并存储在__dict__
a = WithReduce()
b = Normal()
print(asizeof(a)) # 122
print(asizeof(b)) # 240
a.foo = 100
b.foo = 100
print()
print(asizeof(a)) # 112
print(asizeof(b)) # 328
print()
print(a.__dict__) # {}
print(b.__dict__) # {'a': 1, 'foo': 100}
知道这一点,我有两个疑问
为什么WithReduce
没有通过添加变量来占用更多内存
在WithReduce
中添加的变量在哪里
在普通类中,
__dict__
是一个描述符,提供对实例属性的访问:但是,您在
WithReduce
中用普通字典替换了(或至少隐藏了):如果修改这样的类,我不确定属性赋值是如何工作的
setattr
显然不会使用显式的__dict__
属性,而是硬编码(?)来使用描述符,在的某处可能有一个引用相关问题 更多 >
编程相关推荐