Elephant 在「实现缓存机制」的评测结果
这是该 AI 模型在此测试用例上的详细评测结果。
基本信息
- 模型名称:Elephant
- 用例名称:实现缓存机制
- 测试类型:文本生成
- 评测维度:代码生成
系统提示词(System Prompt)
这是给 AI 模型的背景设定和角色指令:
你是一名资深后端开发工程师,擅长数据结构设计与基础组件实现。 回答要求: 1. 使用 Python 或 JavaScript 实现(请明确声明所用语言)。 2. 代码需包含必要的注释,说明关键逻辑。 3. 实现完成后,简要说明你选用的底层数据结构及其原因(1-3 句话即可)。 4. 需覆盖边界情况的处理,并在代码中体现(如 key 不存在时的返回值)。 5. 代码风格清晰,命名语义化,避免魔法数字或不明含义的变量名。
用户提示词(User Prompt)
这是用户给 AI 模型的具体任务要求:
请实现一个简单的缓存类 `SimpleCache`,支持以下功能: **接口要求:** - `set(key, value)`:将键值对存入缓存。若 key 已存在,则覆盖其值。 - `get(key)`:根据 key 获取对应的缓存值。若 key 不存在,返回 `None`(Python)或 `null`(JavaScript)。 - `delete(key)`:删除指定 key 的缓存项。若 key 不存在,不报错,静默处理。 - `size()`:返回当前缓存中存储的键值对数量。 - `clear()`:清空所有缓存项。 **约束条件:** - 不得直接使用语言内置的缓存库(如 Python 的 `functools.lru_cache`),需基于基础数据结构(如字典/Map)自行实现。 - key 类型为字符串,value 可为任意类型。 - 无需考虑并发安全与过期时间(这属于更高难度的要求)。 **示例:**
任务要求
AI 模型需要满足以下要求:
- 「`set` 方法正确记录过期时间戳(使用 `time.time()` + ttl),`ttl <= 0` 时抛出 `ValueError`,`ttl=None` 时永不过期。」
- 「`get` 方法实现惰性删除:访问时判断是否过期,过期则删除并返回 `None`;key 不存在时同样返回 `None`。」
- 「`size()` 返回的是当前有效(未过期)缓存项数量,而非存储的全量条目数。」
- 「`cleanup()` 能正确遍历并删除所有已过期项,返回清理数量,且不影响未过期项。」
- 「重复 `set` 同一 key 时,值和过期时间均被正确更新(覆盖旧记录)。」
- 「演示代码能清晰展示过期行为,设计说明能准确描述惰性删除与主动清理的权衡。」
评测结果
综合得分
该模型在此用例的得分为:— 分(满分 100 分),未通过
基础难度评测结果
- 得分:— 分
- 通过状态:未通过
模型生成产物
以下是该模型针对此任务的实际生成内容:
以下是使用 **Python** 实现的 `SimpleCache` 类: ```python class SimpleCache: """ 一个简单的缓存类,基于字典实现,支持基本的键值对操作。 """ def __init__(self): # 使用字典作为底层存储结构,key 为字符串,value 可为任意类型 self._storage = {} def set(self, key: str, value) -> None: """ 存储或更新一个键值对。 :param key: 字符串类型的键 :param value: 任意类型的值 """ if not isinstance(key, str): raise TypeError("Key must be a string") self._storage[key] = value def get(self, key: str): """ 根据键获取对应的值。 :param key: 字符串类型的键 :return: 存在返回值,否则返回 None """ return self._storage.get(key) def delete(self, key: str) -> None: """ 删除指定键的缓存项。若键不存在,静默处理(不报错)。 :param key: 字符串类型的键 """ # 使用 pop 方法,指定默认值避免 KeyError self._storage.pop(key, None) def size(self) -> int: """ 返回当前缓存中键值对的数量。 :return: 缓存项数量 """ return len(self._storage) def clear(self) -> None: """ 清空所有缓存项。 """ self._storage.clear() # 示例用法 if __name__ == "__main__": cache = SimpleCache() cache.set("name", "Alice") cache.set("age", 30) print(cache.get("name")) # 输出: Alice print(cache.get("gender")) # 输出: None print(cache.size()) # 输出: 2 cache.delete("age") print(cache.size()) # 输出: 1 cache.clear() print(cache.size()) # 输出: 0 ``` --- ### 底层数据结构说明: 使用 **字典(dict)** 作为底层存储结构,因其基于哈希表实现,提供平均 O(1) 时间复杂度的插入、查找和删除操作,非常适合作为缓存的核心容器。 ### 边界处理: - `get()` 使用 `dict.get()` 方法,在 key 不存在时返回 `None`。 - `delete()` 使用 `pop(key, None)` 避免 key 不存在时抛出异常。 - `set()` 中添加类型检查,确保 key 为字符串类型(符合约束)。 ### 代码风格: - 命名清晰(如 `_storage` 表示内部存储,`set/get/delete` 语义明确)。 - 无魔法数字,逻辑自解释。 - 方法职责单一,符合单一职责原则。
AI 评审点评
以下是 AI 评审对该模型输出的点评:
所有评分模型都失败
进阶难度评测结果
- 得分:— 分
- 通过状态:未通过
模型生成产物
以下是该模型针对此任务的实际生成内容:
```python import time class TTLCache: """ 一个支持 TTL(Time-To-Live)功能的缓存类。 使用惰性删除策略:get 时检查过期并清理;cleanup 主动批量清理。 """ def __init__(self): # 存储结构:{key: (value, expire_timestamp)} # expire_timestamp 为 None 表示永不过期 self._store = {} def set(self, key, value, ttl=None): """ 存储键值对,并设置过期时间。 :param key: 键 :param value: 值 :param ttl: 过期秒数(float),None 表示永不过期, expire_at: # 惰性删除:过期则移除并返回 None del self._store[key] return None return value def delete(self, key): """ 手动删除指定键的缓存项。若 key 不存在则静默忽略。 :param key: 键 """ self._store.pop(key, None) def size(self): """ 返回当前有效(未过期)缓存项的数量。 在统计前触发一次惰性检查(仅检查存在的项,不主动清理全部)。 :return: 有效缓存项数量 """ current_time = time.time() valid_count = 0 # 遍历检查每个条目是否过期,但仅统计不主动删除(惰性策略要求仅在 get 时删除) # 为符合“size() 触发惰性检查”的语义,我们仅验证有效性而不删除 for key, (value, expire_at) in self._store.items(): if expire_at is None or current_time expire_at ] for key in to_delete: del self._store[key] return len(to_delete) # ================= 演示代码 ================= if __name__ == "__main__": cache = TTLCache() # 设置永不过期 cache.set("permanent", "data1") print("set permanent:", cache.get("permanent")) # data1 # 设置 1 秒 TTL cache.set("temp", "data2", ttl=1.0) print("set temp (1s TTL):", cache.get("temp")) # data2 # 等待过期 time.sleep(1.1) print("get temp after expired:", cache.get("temp")) # None(惰性删除) # 重复 set 同一 key cache.set("temp", "data3", ttl=2.0) print("reset temp:", cache.get("temp")) # data3 # size 应为 2(permanent + temp 有效) print("size before cleanup:", cache.size()) # 2 # 手动删除 cache.delete("permanent") print("size after delete permanent:", cache.size()) # 1 # 主动清理(此时 temp 尚未过期,应清理 0) print("cleanup count:", cache.cleanup()) # 0 # 让 temp 过期后再次清理 time.sleep(2.1) print("cleanup count after expire:", cache.cleanup()) # 1 print("size after cleanup:", cache.size()) # 0 ``` --- ### 数据结构选择与策略说明 **数据结构选择**:使用字典 `dict` 存储键值对,其中值是一个元组 `(value, expire_timestamp)`。字典提供 O(1) 的平均时间复杂度用于 `set`、`get` 和 `delete`,满足高性能缓存需求。 **过期策略设计**:采用**惰性删除为主、主动清理为辅**的策略。`get` 时检查并删除过期项,避免不必要的全量扫描;`cleanup()`...
AI 评审点评
以下是 AI 评审对该模型输出的点评:
所有评分模型都失败
困难难度评测结果
- 得分:85.0 分
- 通过状态:已通过
模型生成产物
以下是该模型针对此任务的实际生成内容:
### 数据结构设计说明 本缓存系统采用 **HashMap + 双向链表** 的组合结构:`dict` 提供 O(1) 的 key 查找,双向链表维护访问顺序(头为最新,尾为最旧)。时间复杂度:`get`/`set`/`mget`/`mset` 均为 O(1)。空间复杂度 O(n),n 为容量。惰性删除策略确保过期项在 `get` 时被清理,避免额外定时任务开销,同时通过遍历尾节点跳过过期项保证淘汰时优先移除最久未使用的有效数据。 --- ### 完整实现代码 ```python import time class Node: """双向链表节点,存储 key、value、过期时间及前后指针""" def __init__(self, key=None, value=None, expire_at=None): self.key = key self.value = value self.expire_at = expire_at # 过期时间戳(秒),None 表示永不过期 self.prev = None self.next = None class LRUCache: def __init__(self, capacity: int): if capacity Node self.cache = {} # 双向链表:head 为最新,tail 为最旧(使用哨兵节点简化边界操作) self.head = Node() self.tail = Node() self.head.next = self.tail self.tail.prev = self.head # 统计字段 self.hits = 0 self.misses = 0 def _add_node_to_head(self, node: Node): """将节点插入到头部(表示最近使用)""" node.prev = self.head node.next = self.head.next self.head.next.prev = node self.head.next = node def _remove_node(self, node: Node): """从链表中移除指定节点""" prev_node = node.prev next_node = node.next prev_node.next = next_node next_node.prev = prev_node def _move_to_head(self, node: Node): """将已有节点移动到头部(先移除再插入)""" self._remove_node(node) self._add_node_to_head(node) def _pop_tail(self) -> Node: """移除并返回尾部节点(最久未使用),若链表为空返回 None""" if self.tail.prev == self.head: return None node = self.tail.prev self._remove_node(node) return node def _is_expired(self, node: Node) -> bool: """检查节点是否已过期(惰性删除:仅在访问时判断)""" if node.expire_at is None: return False return time.time() >= node.expire_at def get(self, key): """ 获取缓存值: - 若 key 不存在或已过期,返回 None,并更新统计 - 若有效,返回值并将节点移至头部(标记为最近使用) 边界:容量为0时直接返回 None """ if self.capacity == 0: self.misses += 1 return None node = self.cache.get(key) if node is None: self.misses += 1 return None # 惰性删除:检查是否过期 if self._is_expired(node): self._remove_node(node) del self.cache[key] self.misses += 1 return None # 命中:移动至头部并更新统计 self._move_to_head(node) self.hits += 1 return node.value def set(self, key, value, ttl=None): """ 设置缓存值: - 若 key 存在:更新值、TTL 并移至头部 - 若 key 不存在: *...
AI 评审点评
以下是 AI 评审对该模型输出的点评:
【KIMI】整体而言,提供的代码实现了LRU缓存系统的核心功能和要求,包括LRU淘汰逻辑、TTL过期处理、批量操作、命中率统计等,边界情况处理也较为完整。代码结构清晰,主要方法都有注释说明,测试用例覆盖了关键场景。不过在复杂度和健壮性方面还有一定提升空间,如current_size的计算复杂度、异常输入的处理等。
相关链接
您可以通过以下链接查看更多相关内容: