【问题标题】:How to cache value of a function in Python?如何在 Python 中缓存函数的值?
【发布时间】:2013-05-19 16:36:09
【问题描述】:

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

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

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

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

有哪些不错的库可供使用,它们的比较如何?

【问题讨论】:

  • 如果只依赖输入参数,在什么情况下会使缓存值失效?
  • @Daenyth 缓存失效只会按需执行(以防管理员明确要求重新计算值)
  • @JakubM。我要求更高级的库或框架。性能很重要,我想避免 NIH 综合症(即使用可用的库和框架),并希望更改尽可能精简(编辑问题以反映需求)
  • @JanneKarila 我正在寻找的是一种先进的可配置高性能(可能基于某些数据库)解决方案。你能不能别再提醒我应该如何使用装饰器了?

标签: python caching memoization


【解决方案1】:

你可以使用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)

【讨论】:

  • 我正在寻找一种先进的解决方案,而不仅仅是一个解决方案。请阅读有关问题的 cmets。
  • @ChrisJohnson 我的问题很清楚,并且具有实际应用。只是我不接受不可用的答案并不意味着我拒绝这样做。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多