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

如何为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,证明是同一个实例

关键说明

  1. 核心逻辑:__new__是Python类中负责创建实例的方法,用lru_cache(maxsize=None)装饰后,会自动缓存相同参数下生成的实例,后续相同参数调用类构造时直接返回缓存实例。
  2. 初始化控制:Python会在__new__返回实例后自动调用__init__,因此用_initialized标记避免重复执行资源加载,减少不必要的开销。
  3. 参数限制:构造参数必须是可哈希类型(如字符串、数字、元组等),如果需要使用不可哈希参数(如列表),需先转换为可哈希形式(如元组)后再传入。
  4. 缓存管理:若需手动清理缓存,可调用HighResResource.__new__.cache_clear(),但你需求为无界缓存,通常无需主动操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 19:35:44