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

Python中支持函数跨调用访问留存数据的最优结构是什么

竞赛Agent跨调用数据持久化方案

针对需要在多轮函数调用间留存计算结果的场景,以下是不同复杂度的实现方案及适用场景,所有方案均为内存级存储,访问延迟可忽略,完全满足竞赛场景的低延迟要求:

  • 方案1:函数属性缓存

Python中函数本身为可挂载属性的对象,无需额外定义全局变量或类,直接在函数上挂载缓存属性即可,是最轻量的实现方式。
代码示例:

def agent_turn_action(turn_input):
    # 首次调用时初始化耗时计算的长列表,后续调用直接复用
    if not hasattr(agent_turn_action, 'cached_long_list'):
        agent_turn_action.cached_long_list = compute_expensive_long_list()
    # 直接使用缓存数据执行业务逻辑
    cached_list = agent_turn_action.cached_long_list
    # 其余回合处理逻辑

优点:实现极简,不污染全局命名空间,适合缓存变量较少、逻辑简单的小型Agent。

  • 方案2:闭包封装私有状态

如果需要避免缓存属性被外部误修改,可以用闭包把状态封装在函数内部,仅暴露执行入口。
代码示例:

def build_agent():
    # 闭包内部变量仅可被内层函数访问,外部无法修改
    cached_long_list = compute_expensive_long_list()
    def agent_turn_action(turn_input):
        nonlocal cached_long_list
        # 直接使用缓存数据执行逻辑
        # 其余回合处理逻辑
        return action_result
    return agent_turn_action

# 全局仅初始化一次,后续每回合直接调用该实例即可
agent_action = build_agent()

优点:状态完全私有化,稳定性更高,适合需要避免缓存被意外篡改的竞赛场景。

  • 方案3:单例类/全局类实例

也就是你原本考虑的实现方案,适合Agent逻辑复杂、需要缓存大量状态的场景。
代码示例:

class AgentCache:
    _instance = None
    # 单例实现,确保全局仅初始化一次缓存
    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super().__new__(cls, *args, **kwargs)
            # 所有耗时计算仅在首次实例化时执行
            cls._instance.cached_long_list = compute_expensive_long_list()
        return cls._instance

# 每回合调用时直接获取实例,不会重复执行计算
cache = AgentCache()

优点:可扩展性极强,后续如果需要新增缓存逻辑、缓存失效规则、辅助方法都可以直接在类内扩展,适合大型复杂Agent的开发。

选型建议

  • 若Agent逻辑简单,缓存变量少于3个,优先选择函数属性缓存,开发效率最高
  • 若对稳定性要求高,需要避免缓存被外部误改,选择闭包方案
  • 若Agent逻辑复杂,需要缓存大量状态,后续有扩展需求,使用你原本考虑的类方案即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 14:36:06