别再浪费内存了:Python __slots__ 机制深入解析

简介: Python中`__slots__`通过预定义属性名,避免使用`__dict__`存储,显著减少内存占用并提升访问速度。适用于需创建大量实例的场景,如数据处理、科学计算等,以牺牲动态添加属性为代价换取性能优化。

Python 对象的灵活性大家都知道,可以随时给对象添加属性:

class User:  
    pass  
u = User()  
u.name = "Alice"  
u.age = 30

但这种灵活性的代价也很大,每个普通 Python 对象都有个 __dict__ 字典来存储属性,对象一多内存开销就上来了,这时候 __slots__ 就派上用场。

slots 到底在干什么

__slots__ 让你提前声明类会用到哪些属性:

class User:  
    __slots__ = ["name", "age"]  
    def __init__(self, name, age):  
        self.name = name  
        self.age = age

这样做之后对象就不会再创建 __dict__ 了。属性存储变成静态的,查找和赋值都快了,尤其是创建大量实例时内存占用能降不少。

底层存储机制的差异

普通对象把每个属性当作 __dict__ 里的键值对访问属性就要做哈希查找。而用了 __slots__ 之后每个属性在内存里有个固定位置,访问变成了直接的数组索引操作省掉了字典查找的开销。

说白了就是把 Python 对象存储搞得像 C 的结构体一样紧凑。

内存能省多少

看个对比:

class Normal:  
    def __init__(self):  
        self.a = 1  
        self.b = 2  

class Slotted:  
    __slots__ = ["a", "b"]  
    def __init__(self):  
        self.a = 1  
        self.b = 2

如果要创建几百万个实例,用 __slots__ 的版本能少用 50-70% 的内存。

属性访问快主要是因为:省掉了字典查找、不用算哈希值、也没有额外的内存间接访问,属性访问时间一般能减少 20-40%。

使用限制

__slots__ 也不是完美的,有些限制得注意。

最明显的是不能随便加属性了:

u = User()  
u.address = "NYC"  # ❌ AttributeError

继承的时候也麻烦,子类得定义自己的 __slots__,而且混用带slots和不带slots的类要小心。多重继承更复杂只有slots名不冲突才行。

另外默认不支持弱引用,要用的话得在 __slots__ 里显式加上 __weakref__

什么场景适合用

几个典型场景:处理大数据集时有几百万个对象;科学计算里的轻量数据结构、游戏引擎里的实体和粒子系统等等,总之就是那些对内存和速度敏感的地方。

一些实用技巧

配合类型提示用能让代码更清晰。可以和 @property 装饰器结合,该灵活的地方还是保持灵活。空类直接用 __slots__ = () 把开销降到最低。

总结

__slots__ 就是让你用灵活性换内存效率和更快的属性访问。对于高性能场景来说这是个必须掌握的优化手段。

就算项目暂时不缺内存,理解 __slots__ 本身也很有价值。它能让你明白 Python 对象是怎么存属性的、属性查找为什么有成本、Python 在灵活性和效率之间怎么权衡。

这些知识对系统设计、性能调优、排查问题都有帮助。

https://avoid.overfit.cn/post/c18314c17e0047358cb13c0a990067ae
作者:Elshad Karimov

目录
相关文章
|
5天前
|
数据采集 人工智能 安全
|
14天前
|
云安全 监控 安全
|
6天前
|
自然语言处理 API
万相 Wan2.6 全新升级发布!人人都能当导演的时代来了
通义万相2.6全新升级,支持文生图、图生视频、文生视频,打造电影级创作体验。智能分镜、角色扮演、音画同步,让创意一键成片,大众也能轻松制作高质量短视频。
1197 152
|
19天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1851 9
|
11天前
|
人工智能 自然语言处理 API
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸
一句话生成拓扑图!next-ai-draw-io 结合 AI 与 Draw.io,通过自然语言秒出架构图,支持私有部署、免费大模型接口,彻底解放生产力,绘图效率直接爆炸。
756 152
|
8天前
|
SQL 自然语言处理 调度
Agent Skills 的一次工程实践
**本文采用 Agent Skills 实现整体智能体**,开发框架采用 AgentScope,模型使用 **qwen3-max**。Agent Skills 是 Anthropic 新推出的一种有别于mcp server的一种开发方式,用于为 AI **引入可共享的专业技能**。经验封装到**可发现、可复用的能力单元**中,每个技能以文件夹形式存在,包含特定任务的指导性说明(SKILL.md 文件)、脚本代码和资源等 。大模型可以根据需要动态加载这些技能,从而扩展自身的功能。目前不少国内外的一些框架也开始支持此种的开发方式,详细介绍如下。
574 5
|
13天前
|
人工智能 安全 前端开发
AgentScope Java v1.0 发布,让 Java 开发者轻松构建企业级 Agentic 应用
AgentScope 重磅发布 Java 版本,拥抱企业开发主流技术栈。
704 14