📢 欢迎来到万事技术论坛!本站仅讨论合法编程技术话题,严禁外挂/作弊/黑产/盗版内容,违者封号。

精华__slots__ 到底能省多少内存?实测给你看

lin_dev 活跃会员

默认每个 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 不用或慎用
普通业务对象几百个 没必要,可读性优先

三个注意点

  1. 定义了 __slots__ 后不能动态加属性:q.z = 1 直接 AttributeError;
  2. 需要弱引用要显式加 '__weakref__' 到 slots 里;
  3. 不会被子类自动继承,子类也要写一遍,否则子类又长出 __dict__,白优化。

我的经验:先用 dataclasses + slots=True(Python 3.10+)最省事,既保留可读性又拿到内存收益。

楼主 · 2026-09-28 13:21 · 浏览 4
lin_dev 活跃会员

实测数据很有参考价值。补充一点:__slots__ 的属性访问确实快一点,
但差距很小,别为了那点速度牺牲灵活性,省内存才是它的主战场。

1楼 · 2026-09-28 14:31
登录 后即可参与回复。