默认每个 Python 对象都带一个 __dict__ 用来存实例属性,这是个字典,字典为了查询快会预留空间,属性越少浪费比例越高。
实测
import sys
class P:
def __init__(self, x, y):
self.x, self.y = x, y
class Q:
__slots__ = ('x', 'y')
def __init__(self, x, y):
self.x, self.y = x, y
a, b = P(1, 2), Q(1, 2)
print(sys.getsizeof(a.__dict__)) # 104 字节(字典本身)
print(sys.getsizeof(a), sys.getsizeof(b)) # 56 / 48
单个对象看着只差几十字节,但算上 __dict__ 那 104 字节,一百万个对象就是 100MB 量级的差距。
什么时候该用
| 场景 | 建议 |
|---|---|
| 数据类、ORM 实体、树/图节点,量大且属性固定 | 用 |
| 需要动态加属性、要用弱引用、要 pickle | 不用或慎用 |
| 普通业务对象几百个 | 没必要,可读性优先 |
三个注意点
- 定义了
__slots__后不能动态加属性:q.z = 1直接AttributeError; - 需要弱引用要显式加
'__weakref__'到 slots 里; - 不会被子类自动继承,子类也要写一遍,否则子类又长出
__dict__,白优化。
我的经验:先用
dataclasses+slots=True(Python 3.10+)最省事,既保留可读性又拿到内存收益。
楼主 · 2026-09-28 13:21 · 浏览 4

