为什么我的LRU缓存错过了相同的参数?

时间:2016-03-01 20:34:49

标签: python caching functools

我有一些看起来像这样的代码:

from functools import lru_cache


@lru_cache()
def get_cheese(type):
    print('{}? We\'re all out.'.format(type))
    return None

get_cheese(type='cheddar')
get_cheese('cheddar')
print(get_cheese.cache_info())

cache_info()报告两个未命中 - 但我使用相同的参数调用了该函数。

它实际上花了一些时间,但我发现它是因为在一个实例中我使用关键字arg,而另一个我使用位置参数。

为什么

1 个答案:

答案 0 :(得分:2)

functools.lru_cache创建的包装器不会尝试检查或复制包装函数的签名。 Python版本为defined

def wrapper(*args, **kwargs):
    ...
    key = make_key(args, kwds, typed)
    ...

正如您所看到的,它构建了基于argskwargs的缓存中使用的密钥,而不知道任何位置或关键字参数是否相同。 C version类似地构建密钥而不关心原始签名。

至于为什么这样设计?我不知道最初的理由。它可能是故意的,要么是为了简化实现,要么是为了避免将关键字参数与位置匹配的开销,或者它可能是一个疏忽。如果你认为改变它是值得的,你可以在issue tracker上提出它。