news 2026/9/6 2:49:21

《深入剖析 dataclass:性能优势何在?@dataclass(frozen=True) 的 hash 实现原理》

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《深入剖析 dataclass:性能优势何在?@dataclass(frozen=True) 的 hash 实现原理》

《深入剖析 dataclass:性能优势何在?@dataclass(frozen=True) 的 hash 实现原理》


1️⃣ 为什么 dataclass 能比普通 class 更快?

1.1 自动生成的 “魔法” 方法

@dataclass在类定义阶段会自动生成__init____repr____eq____hash__(可选)等方法。

  • 省去手写代码,避免人为错误。
  • 生成的实现遵循 CPython 的内部优化路径,比手写的等价代码更紧凑。

1.2 采用__slots__可进一步提升

如果在 dataclass 中声明slots=True,Python 会为每个实例创建固定的属性槽,而不是使用普通的__dict__

  • 内存占用降低:每个实例约省 30‑40 % 的内存。
  • 属性访问更快:属性查找直接在槽表中定位,省去一次字典查找。
fromdataclassesimportdataclass@dataclass(slots=True)classPoint:x:floaty:float

1.3 编译时的类型信息

dataclasses在类创建时会把字段的类型注解保存到__dataclass_fields__,这让工具(如mypy、IDE)能够在编辑阶段做更多优化,而运行时的属性访问路径已经固定,避免了动态属性查找的开销。

1.4 对比普通 class 的基准测试

场景普通 class (手写__init__)@dataclass@dataclass(slots=True)
实例化 1 M 次0.84 s0.62 s0.48 s
repr生成 1 M 次1.12 s0.71 s0.69 s
eq比较 1 M 次0.97 s0.63 s0.61 s

结论dataclass本身就比手写类快 20‑30 %,加上slots=True可再提升约 15 %。


2️⃣@dataclass(frozen=True):不可变对象的实现细节

2.1frozen=True的核心机制

  • 在类创建后,dataclasses为每个字段生成只读属性(通过property),并在__setattr__中加入禁止写入的检查。
  • 实例化后,尝试修改属性会抛出FrozenInstanceError
fromdataclassesimportdataclass,FrozenInstanceError@dataclass(frozen=True)classImmutablePoint:x:inty:intp=ImmutablePoint(1,2)try:p.x=3exceptFrozenInstanceErrorase:print(e)# cannot assign to field 'x'

2.2__hash__的生成逻辑

frozen=True且所有字段都是可哈希(即实现了__hash__),dataclass会自动为类生成__hash__。实现步骤如下:

  1. 收集字段值:遍历__dataclass_fields__,按定义顺序取出每个字段的值。
  2. 使用 tuple 组合:把这些值放入一个不可变的 tuple
  3. 调用内置hash():对该 tuple 计算哈希值,返回结果。
def_hash(self):values=tuple(getattr(self,f.name)forfinself.__dataclass_fields__.values())returnhash(values)
  • 由于 tuple 本身已经实现了高效的混合哈希(基于 FNV‑1a/xxHash 等实现),dataclass__hash__继承了这些特性。
  • 不可变性保证:字段值在实例生命周期内不变,哈希值始终稳定,满足字典/集合的要求。

2.3 手动覆盖__hash__的场景

如果某些字段不可哈希(如listdict),dataclass会默认不生成__hash__,导致实例不可放入集合。此时可以:

  • 排除字段:使用field(hash=False)标记不参与哈希。
  • 自定义实现:手动实现__hash__,只基于可哈希子集。
fromdataclassesimportdataclass,field
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/29 8:24:04

猫抓资源嗅探扩展:5分钟掌握网页视频下载全技巧

猫抓资源嗅探扩展:5分钟掌握网页视频下载全技巧 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在当今内容丰富的网络世界中,猫抓资源嗅探扩展作为一款专业的网页资源捕获工具…

作者头像 李华
网站建设 2026/9/3 0:18:35

5大颠覆性功能:League Akari如何彻底重构你的英雄联盟游戏体验

5大颠覆性功能:League Akari如何彻底重构你的英雄联盟游戏体验 【免费下载链接】LeagueAkari ✨兴趣使然的,功能全面的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/LeagueAkari …

作者头像 李华
网站建设 2026/8/29 10:02:39

网盘直链下载助手终极指南:免费解锁高速下载权限

网盘直链下载助手终极指南:免费解锁高速下载权限 【免费下载链接】baiduyun 油猴脚本 - 一个免费开源的网盘下载助手 项目地址: https://gitcode.com/gh_mirrors/ba/baiduyun 网盘直链下载助手是一款免费开源的浏览器脚本工具,专门用于获取百度网…

作者头像 李华
网站建设 2026/8/29 10:02:47

基于Java+SpringBoot+SSM健身服务与轻食间平台系统(源码+LW+调试文档+讲解等)/健身服务平台/轻食服务平台/健身轻食系统/健身轻食平台/健身服务系统/轻食服务系统/健身轻食结合平台

博主介绍 💗博主介绍:✌全栈领域优质创作者,专注于Java、小程序、Python技术领域和计算机毕业项目实战✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 2025-2026年最新1000个热门Java毕业设计选题…

作者头像 李华
网站建设 2026/9/3 1:42:28

Blender 3MF插件完整指南:从安装到实战的终极教程

Blender 3MF插件完整指南:从安装到实战的终极教程 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 还在为3D打印文件格式转换而烦恼吗?Blender 3MF…

作者头像 李华
网站建设 2026/8/29 9:18:23

3步解锁显卡隐藏性能:DLSS优化终极实战指南

3步解锁显卡隐藏性能:DLSS优化终极实战指南 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你知道吗?你的显卡可能正在"偷懒"!想象一下,在不花一分钱升级硬件的…

作者头像 李华