跳转至

Agent 工具注册表用 list 存还是 dict 存,有什么区别?

⚙️ 工具注册表的核心操作是按名字找工具。选 list 还是 dict,其实就是在选“遍历”还是“索引”。


📋 List:顺序存储,查找靠遍历

tools = [
    Tool("search", ...),
    Tool("calculator", ...),
    Tool("weather", ...)
]

def find_tool(name):
    for t in tools:
        if t.name == name:
            return t
  • 添加:O(1),直接 append

  • 查找:O(n),要一个一个比对名字

  • 内存:只存元素本身,省空间

🔹 如果注册表很小(比如就 5~10 个工具),遍历开销几乎可以忽略,用 list 简单直接。


📖 Dict:键直接映射到工具对象

tools = {
    "search": Tool("search", ...),
    "calculator": Tool("calculator", ...),
    "weather": Tool("weather", ...)
}

def find_tool(name):
    return tools[name]   # 或 .get()
  • 添加:O(1) 均摊

  • 查找:O(1),通过哈希直接定位

  • 内存:多了哈希表开销(indices + entries)

🔸 当工具数量上到几十甚至上百,或者 Agent 每处理一条消息就要解析好几次工具名时,O(1) 的查找优势就非常明显。


⚖️ 直接对比

维度 List Dict
🔍 按名查找 O(n) O(1)
➕ 注册新工具 O(1) O(1) 均摊
📦 内存占用 更低 稍高(哈希表)
🔁 遍历所有工具 天然顺序 Python 3.7+ 保留插入顺序
🧩 同名处理 要手动去重 后插入直接覆盖
🗂️ 代码可读性 tools[0] 不明所以 tools["search"] 表意清晰

🧠 选哪个?

  • 工具少,且常用模式是“全部遍历”(比如每个工具都试一遍),list 很合适。

  • 工具多,或者调用频繁,核心操作是按名派发,dict 是标准答案。绝大多数 Agent 框架(LangChain、AutoGPT)内部都是 dict 或类似映射结构,因为运行时绝大多数情况是“已知工具名,找到函数然后调它”。

实际项目里我甚至会用 dict[name] → callable,连 Tool 对象都省了,直接映射到可执行函数。毕竟越靠近热路径,越值得用哈希。