You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中__slots__与dataclasses的内存占用及访问时间对比

好的,咱们来好好对比下Python里__slots__和dataclasses在内存占用与属性访问速度上的差异,结合你已经了解的知识点展开说:

内存占用对比
  • __slots__的核心优化:你说的完全没错,默认Python类实例会用__dict__这个字典来存储属性,而字典本身因为哈希表的结构,会带来不少额外内存开销。__slots__则是让实例把属性存入一个固定大小的数组(类似元组或列表的存储方式),直接砍掉了__dict__的内存消耗——除非你特意在__slots__里加上'__dict__'字段,允许动态添加属性。另外,__slots__还会默认阻止实例生成__weakref__引用(需要的话也可以手动加这个字段),进一步压缩内存。如果是创建成百上千个实例的场景,这个内存节省效果会非常显著。
  • dataclasses的默认内存表现:dataclass本质是帮你自动生成__init__、__repr__这些常用方法,底层默认还是用普通的__dict__来存储属性,所以内存占用和手写的普通类没区别,完全没有__slots__的优化效果。
  • 两者直接对比:不加slots=True的dataclass,内存占用远高于使用__slots__的类;但如果给dataclass加上slots=True参数,它的内存占用就和手动定义__slots__的类几乎一致——因为此时dataclass会自动帮你生成对应的__slots__字段,复用了同样的数组存储逻辑。
属性访问时间对比
  • __slots__的访问效率:因为属性存在数组里,访问时是直接通过索引定位(就像列表取元素那样),不需要经过字典的哈希查找步骤,所以属性访问速度会比普通类(包括默认dataclass)快不少。在频繁读写属性的场景下,这个速度差异会被明显放大。
  • dataclasses的默认访问效率:默认状态下,dataclass的属性访问和普通类一样,都是字典的键查找,速度比__slots__慢。但如果启用了slots=True,它的属性访问速度就和__slots__类几乎持平,因为底层存储变成了数组,访问逻辑完全一致。
  • 小补充:如果给dataclass加上frozen=True(设置为不可变类),它的访问速度会比普通dataclass稍快一点,但还是赶不上__slots__的直接索引访问。
两者结合的实用场景

你提到的两者可以同时使用,确实是非常实用的组合:当你想要dataclass带来的便捷性(自动生成初始化方法、字符串表示等),又想享受__slots__的内存和速度优势时,只需要在@dataclass装饰器里加上slots=True参数就行,举个简单例子:

from dataclasses import dataclass

@dataclass(slots=True)
class Person:
    name: str
    age: int

这个类既拥有dataclass的所有便捷特性,又具备__slots__的内存优化和更快的访问速度,同时也和纯__slots__类一样,不能随意添加额外属性(除非你在slots里显式加入__dict__)。

内容的提问来源于stack exchange,提问作者Kostas Mouratidis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:41:52