为什么Python 3中使用__slots__的对象反而占用更多内存?
问题分析:为什么用__slots__的对象序列化后反而更大?
先看测试代码:
>>> class A: ... __slots__ = ("a",) ... def __init__(self): ... self.a = 1 ... >>> class B: ... def __init__(self): ... self.b = 1 ... >>> import pickle as pk >>> len(pk.dumps(A())) 40 >>> len(pk.dumps(B())) 36 >>> a = A() >>> a.b = 2 Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'A' object has no attribute 'b'
核心原因:__slots__优化的是运行时内存,而非序列化后的字节大小
很多人误以为__slots__能全方位缩减对象体积,但它的设计目标是避免每个实例创建独立的__dict__字典,从而节省运行时的内存开销——这一点从你给A实例添加额外属性报错就能看出来,A没有__dict__。
但pickle的序列化逻辑和运行时内存管理完全不同:
- 对于普通类B的实例,pickle只需要序列化它的
__dict__内容(也就是{'b':1}),再加上少量类标识信息。 - 对于用了
__slots__的类A的实例,pickle需要额外记录该类的__slots__定义信息,还要逐个序列化slot里的属性值。虽然属性数量相同,但序列化时携带的元数据更多,最终导致字节数反而更大。
简单总结:运行时A的实例确实比B小(因为没有额外的__dict__),但序列化时pickle要多存一份__slots__的描述信息,所以总字节数超过了B的实例。
内容的提问来源于stack exchange,提问作者qwerty_99
相关产品推荐
相关产品推荐

