You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 08:06:13