0

我有一个函数,它给定一个参数计算相应的值并返回它。函数的返回值仅取决于其参数,因此我想以某种方式缓存(记忆)该值。此外,我还希望能够使缓存值无效。

这似乎是一个普遍的需求,所以我试图避免重新发明轮子。

我正在寻找的是一个高级的高度可配置的高性能库(工具、框架等),并且希望更改尽可能精简。一些优点是:

  • 有效处理并发请求
  • 能够使用不同的缓存后端(例如 RAM 或 DB)
  • 保持对大规模数据的响应能力

有哪些好的库可以使用,它们是如何比较的?

4

2 回答 2

3

您可以使用functools.lru_cache一个简单的内存缓存。

缓存函数示例:

import functools

@functools.lru_cache()
def f(x, y):
    return x+y

print(f(7, 4))
11

清除整个缓存:

f.cache_clear()

清除特定值的缓存(脏,脏 hack,因为没有直接访问缓存字典):

def clear_cache_value(cached_function, *args, **kwargs):
    cache = next(c.cell_contents for c in cached_function.cache_info.__closure__ if isinstance(c.cell_contents, dict))
    del cache[functools._make_key(args, kwargs, False)]

clear_cache_value(f, 7, 4)
于 2013-05-19T17:01:09.233 回答
3

这个问题对我来说没有多大意义。当您开始谈论“高性能”和“并发请求”时,您实际上并不是在谈论在应用程序中使用 Python 库——这听起来更像是使用(或构建)某种专用的、外部的专用服务或守护进程.

就个人而言,我混合使用记忆和“延迟加载”或“延迟”属性来定义缓存获取(和计算)。通过“延迟加载”,我的意思是,我不是总是提取(或计算)缓存数据,而是创建一个代理对象,该对象具有在首次访问时从缓存中调用 get/create 函数的所有信息。当涉及到数据库支持的材料时,我还发现分组缓存未命中和合并缓存获取很有用——这允许我在可能的情况下并行加载(而不是多个串行请求)。

dogpile.cache负责我的缓存管理(get、set、invalidate),它被配置为存储在 memcached 或 dbm 中(它允许多个后端)。我使用两个轻量级对象(12 行?)来处理延迟获取。

于 2013-05-19T18:02:09.763 回答