类变量和实例变量在内存中存储的方式对代码性能有哪些影响?
类变量、实例变量内存存储方式对性能的完整影响底层根源类变量仅一份存于类对象__dict__所有实例仅持有引用不复制数据实例变量每份独立存在每个实例自己的__dict__实例越多内存占用线性上涨。下面分 6 个核心性能维度逐一说明。1. 堆内存占用性能类变量全局只分配一次内存百万实例也不会复制多份数据。优势内存占用极低减少堆内存压力数据集中CPU L1/L2 缓存命中率高减少缺页中断、操作系统内存交换海量实例场景避免 OOM。适用统一常量、全局配置、固定枚举。实例变量每创建一个实例就要在实例字典中开辟空间存储属性。劣势大量实例存储相同配置时产生大量重复数据内存碎片化缓存失效频繁读写变慢。优化手段海量实例用__slots__移除实例__dict__内存直接减半。隐性性能坑python运行class A: num 10 obj A() obj.num 99这行不会修改类变量而是在实例内存新建同名实例变量。大量实例这么写原本复用的共享内存变成海量独立副本内存开销暴增。2. 对象实例化创建速度类变量实例创建时不需要拷贝、不需要写入实例字典仅分配对象头部内存初始化更快。 批量循环创建上万、百万对象时总耗时差距明显。实例变量self.xxx val等价于向实例__dict__执行哈希插入属于运行时开销。实例变量越多单次实例化越慢批量创建时耗时叠加。3. 属性读取访问速度类名.类变量直接查询类的属性字典一次哈希查找速度最快。实例.类变量先查实例__dict__找不到再向上查找类字典多一层查找链路略慢于实例变量。实例.实例变量直接读取当前实例字典一次哈希查询寻址路径短读取稳定。说明普通业务循环差距可忽略亿次高频循环场景才会体现明显耗时差异。4. GC 垃圾回收性能类变量依附类对象程序运行全程常驻内存引用计数极少变动。 大量实例频繁创建销毁时不会频繁修改该变量引用计数GC 标记、扫描压力小STW程序停顿少接口延迟更稳定。实例变量绑定单个实例实例创建、销毁都会修改所有实例变量引用计数。 高并发下大量临时对象频繁新建销毁会频繁触发分代 GC造成卡顿、吞吐量下降、接口延迟抖动。5. CPU 缓存命中率类变量全局唯一所有实例频繁读取数据常驻高速缓存重复读取效率极高海量实例变量分散在堆不同地址内存碎片化严重遍历时频繁缓存失效大量缺页中断拉高耗时。6. 可变容器list/dict并发性能两极分化类变量存可变容器所有实例指向同一块堆内存单线程读写无拷贝读取性能优秀 但多线程并发修改同一内存会数据竞争必须加互斥锁。锁竞争、线程切换会大幅降低并发吞吐量性能暴跌。实例变量存可变容器每个实例独立内存天然隔离无需加锁不存在竞争损耗并发性能稳定代价是内存占用更高。补充slots对实例存储的性能优化默认实例靠__dict__哈希表存属性开销大使用__slots__取消实例字典属性存固定数组内存减少 50%属性访问由哈希查找变为数组下标读取小幅提速禁止动态新增属性避免内存碎片化。性能维度对比汇总表表格性能维度类变量共享单份内存实例变量每个实例独立内存内存占用极低全局复用缓存友好随实例数量线性增长易碎片化实例化速度更快无字典写入开销稍慢每次初始化要写入实例字典属性读取类名访问最快实例访问略慢单次哈希查找寻址最短GC 压力极小常驻内存极少触发 GC 停顿大频繁创建销毁易引发 GC 卡顿CPU 缓存高频读取易命中高速缓存海量实例易缓存失效多线程修改需加锁高并发锁竞争损耗大数据隔离无锁并发性能稳定性能层面开发选型建议全局只读常量、统一配置 → 类变量优先类名.变量访问提速对象独有属性、可变列表 / 字典 → 实例变量规避共享内存竞争与污染十万级海量实例场景实例变量搭配__slots__压缩内存禁止用实例.变量 值覆盖类变量避免共享内存优势失效带来额外内存与 GC 开销。