news 2026/4/18 13:10:12

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
别再浪费内存了:Python __slots__ 机制深入解析

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 2:23:11

Keyboard Chatter Blocker完整使用手册:彻底告别机械键盘连击烦恼

Keyboard Chatter Blocker完整使用手册:彻底告别机械键盘连击烦恼 【免费下载链接】KeyboardChatterBlocker A handy quick tool for blocking mechanical keyboard chatter. 项目地址: https://gitcode.com/gh_mirrors/ke/KeyboardChatterBlocker 你是否曾经…

作者头像 李华
网站建设 2026/4/18 4:04:32

终极解决方案:用开源工具彻底告别键盘连击烦恼

终极解决方案:用开源工具彻底告别键盘连击烦恼 【免费下载链接】KeyboardChatterBlocker A handy quick tool for blocking mechanical keyboard chatter. 项目地址: https://gitcode.com/gh_mirrors/ke/KeyboardChatterBlocker 还在为机械键盘的连击问题而烦…

作者头像 李华
网站建设 2026/4/18 3:49:38

工业控制设备中lcd显示屏低功耗实现方法

工业控制设备中LCD显示屏低功耗实现:从硬件优化到系统级节能的实战路径在一间典型的工业自动化车间里,PLC操作面板上的TFT-LCD屏幕正持续显示着产线运行状态。它清晰、直观,是工程师与机器沟通的“窗口”。但很少有人意识到——这块看似不起眼…

作者头像 李华
网站建设 2026/4/18 4:03:08

终极指南:如何使用Legacy-iOS-Kit轻松越狱和降级旧版iOS设备

终极指南:如何使用Legacy-iOS-Kit轻松越狱和降级旧版iOS设备 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to downgrade/restore, save SHSH blobs, and jailbreak legacy iOS devices 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit …

作者头像 李华
网站建设 2026/4/18 1:55:19

蓝牙水控器技术解密:从校园痛点到大厂开源方案的完美逆袭

蓝牙水控器技术解密:从校园痛点到大厂开源方案的完美逆袭 【免费下载链接】waterctl 深圳市常工电子“蓝牙水控器”控制程序的开源实现。适用于国内各大高校宿舍热水器。 项目地址: https://gitcode.com/gh_mirrors/wa/waterctl 在校园生活中,热水…

作者头像 李华
网站建设 2026/4/18 12:01:40

ModbusTCP报文解析:协议栈数据校验机制详解

ModbusTCP 报文解析与数据校验机制:从协议结构到实战调试 在工业自动化现场,你是否曾遇到过这样的问题——明明程序逻辑没有错,设备也通电运行正常,但 PLC 读取的寄存器值却“偶尔跳变”?或者 SCADA 系统突然报出“响应…

作者头像 李华