如何在Python中缓存函数的值?

时间:2013-05-19 16:36:09

标签: python caching memoization

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

这似乎是一种常见的需求,所以我试图避免重新发明轮子。

我正在寻找的是一个先进的高度可配置的高性能库(工具,框架等),并希望这些更改尽可能精益。一些好处是:

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

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

2 个答案:

答案 0 :(得分:3)

这个问题对我来说没什么意义。当你开始谈论“高性能”和“并发请求”时,你并没有真正谈论在应用程序中使用Python库 - 这听起来更像是使用(或构建)某种专用的外部专用服务或守护进程。

就个人而言,我使用memoization和'lazy loaded'或'deferred'属性的混合来定义缓存获取(和计算)。通过'lazy loaded',我的意思是我不是总是拉(或计算)缓存数据,而是创建一个代理对象,它具有在第一次访问时从缓存调用get / create函数的所有信息。当谈到数据库支持的材料时,我也发现将缓存未命中分组并整合缓存获取很有用 - 这允许我在可能的情况下并行加载(而不是多个串行请求)。

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

答案 1 :(得分:2)

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

缓存函数的一个示例:

import functools

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

print(f(7, 4))
11

清除整个缓存:

f.cache_clear()

清除特定值的缓存(脏,脏黑客,因为没有直接访问缓存dict):

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)