如何为Python内存密集型类实例实现无界caching以复用相同实例?
最符合Python风格的实现方法
使用functools.lru_cache装饰类的__new__方法,结合初始化标记避免重复执行加载逻辑,就能实现相同构造参数复用实例的无界缓存需求,完全匹配你的使用场景要求。
具体实现代码
import functools class HighResResource: # 用无界LRU缓存装饰__new__方法,拦截实例创建逻辑 @functools.lru_cache(maxsize=None) def __new__(cls, filename): # 仅当缓存中无对应参数的实例时,调用父类方法创建新实例 return super().__new__(cls) def __init__(self, filename): # 标记是否已完成初始化,避免复用实例时重复执行资源加载 if hasattr(self, "_initialized"): return # 替换为实际的高分辨率资源加载逻辑 print(f"加载资源: {filename}") self.filename = filename # 模拟大内存占用的资源对象 self.resource_data = bytearray(1024 * 1024 * 100) # 100MB self._initialized = True
效果验证
# 第一次实例化:执行资源加载逻辑 res1 = HighResResource("model_8k.pth") # 第二次用相同参数实例化:直接复用已有实例,不执行加载 res2 = HighResResource("model_8k.pth") print(res1 is res2) # 输出: True,证明是同一个实例
关键说明
- 核心逻辑:
__new__是Python类中负责创建实例的方法,用lru_cache(maxsize=None)装饰后,会自动缓存相同参数下生成的实例,后续相同参数调用类构造时直接返回缓存实例。 - 初始化控制:Python会在
__new__返回实例后自动调用__init__,因此用_initialized标记避免重复执行资源加载,减少不必要的开销。 - 参数限制:构造参数必须是可哈希类型(如字符串、数字、元组等),如果需要使用不可哈希参数(如列表),需先转换为可哈希形式(如元组)后再传入。
- 缓存管理:若需手动清理缓存,可调用
HighResResource.__new__.cache_clear(),但你需求为无界缓存,通常无需主动操作。
内容的提问来源于stack exchange,提问作者eliangius
相关产品推荐
相关产品推荐

