我有一个函数,它给定一个参数计算相应的值并返回它。函数的返回值仅取决于其参数,因此我想以某种方式缓存(记忆)该值。此外,我还希望能够使缓存值无效。
这似乎是一个普遍的需求,所以我试图避免重新发明轮子。
我正在寻找的是一个高级的高度可配置的高性能库(工具、框架等),并且希望更改尽可能精简。一些优点是:
- 有效处理并发请求
- 能够使用不同的缓存后端(例如 RAM 或 DB)
- 保持对大规模数据的响应能力
有哪些好的库可以使用,它们是如何比较的?
我有一个函数,它给定一个参数计算相应的值并返回它。函数的返回值仅取决于其参数,因此我想以某种方式缓存(记忆)该值。此外,我还希望能够使缓存值无效。
这似乎是一个普遍的需求,所以我试图避免重新发明轮子。
我正在寻找的是一个高级的高度可配置的高性能库(工具、框架等),并且希望更改尽可能精简。一些优点是:
有哪些好的库可以使用,它们是如何比较的?
您可以使用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)
这个问题对我来说没有多大意义。当您开始谈论“高性能”和“并发请求”时,您实际上并不是在谈论在应用程序中使用 Python 库——这听起来更像是使用(或构建)某种专用的、外部的专用服务或守护进程.
就个人而言,我混合使用记忆和“延迟加载”或“延迟”属性来定义缓存获取(和计算)。通过“延迟加载”,我的意思是,我不是总是提取(或计算)缓存数据,而是创建一个代理对象,该对象具有在首次访问时从缓存中调用 get/create 函数的所有信息。当涉及到数据库支持的材料时,我还发现分组缓存未命中和合并缓存获取很有用——这允许我在可能的情况下并行加载(而不是多个串行请求)。
dogpile.cache
负责我的缓存管理(get、set、invalidate),它被配置为存储在 memcached 或 dbm 中(它允许多个后端)。我使用两个轻量级对象(12 行?)来处理延迟获取。