【发布时间】:2021-03-28 15:18:15
【问题描述】:
如何配置lru_cache 以根据接收到的实际值而不是函数的调用方式为其缓存设置键?
>>> from functools import lru_cache
>>> @lru_cache
... def f(x=2):
... print("reticulating splines...")
... return x ** 2
...
>>> f()
reticulating splines...
4
>>> f(2)
reticulating splines...
4
>>> f(x=2)
reticulating splines...
4
换句话说,只有上面的第一个调用应该是缓存未命中,其他两个应该是缓存命中。
【问题讨论】:
-
docs do 状态:不同的参数模式可以被认为是具有不同缓存条目的不同调用。例如,f(a=1, b=2) 和 f(b=2, a=1) 的关键字参数顺序不同,可能有两个单独的缓存条目。看起来您可以使用
f.cache_info()方法查看实际的缓存命中/未命中。 -
我知道,但我不认为这是一个明智的默认行为 - 这些调用对于所有实际目的都是相同的。我想以这样一种方式包装(或替换)lru_cache,以避免同一底层调用的所有各种不同拼写的缓存未命中。
-
@bnaecker:不,因为问题试图实现的行为取决于函数签名,
make_key不知道。 -
为什么
f()和f(x=2)的处理方式不同?args=()和kwds={'x': 2}在这两种情况下都不是吗? -
@mkrieger1:不。默认值不是关键字参数。
标签: python function caching memoization functools