通过删除元类中的_dict______)内容减少类内存

2024-09-30 04:39:51 发布

您现在位置:Python中文网/ 问答频道 /正文

为了寻找减少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中添加的变量在哪里


Tags: 内存nameselfreducenewfoodefattrs
1条回答
网友
1楼 · 发布于 2024-09-30 04:39:51

在普通类中,__dict__是一个描述符,提供对实例属性的访问:

>>> Normal.__dict__['__dict__']
<attribute '__dict__' of 'Normal' objects>
>>> Normal.__dict__['__dict__'].__get__(b)
{'a': 1, 'foo': 100}

但是,您在WithReduce中用普通字典替换了(或至少隐藏了):

>>> WithReduce.__dict__['__dict__']
{}

如果修改这样的类,我不确定属性赋值是如何工作的setattr显然不会使用显式的__dict__属性,而是硬编码(?)来使用描述符,在的某处可能有一个引用

相关问题 更多 >

    热门问题