functool的cache和lru_cache的区别

use*_*984 30 python recursion functional-programming

最近我遇到了functools.cache,不知道它与functools.lru_cache.

我找到了关于和之间的区别的帖子,但没有专门针对和 的帖子。functools.cached_propertylru_cachecachelru_cache

use*_*984 44

functools.cache是3.9版本新添加的。

\n

文档指出:

\n
\n

简单的轻量级无界函数缓存。有时称为 \xe2\x80\x9cmemoize\xe2\x80\x9d。

\n

返回与 相同lru_cache(maxsize=None),为函数参数的字典查找创建一个薄包装器。因为它永远不需要驱逐旧值,所以这比lru_cache()大小限制更小、更快。

\n
\n

文档中的示例:

\n
@cache\ndef factorial(n):\n    return n * factorial(n-1) if n else 1\n\n>>> factorial(10)      # no previously cached result, makes 11 recursive calls\n3628800\n>>> factorial(5)       # just looks up cached value result\n120\n>>> factorial(12)      # makes two new recursive calls, the other 10 are cached\n479001600\n
Run Code Online (Sandbox Code Playgroud)\n

所以,简而言之:cachelru_cache(maxsize=None)完全相同(链接到 cpython 源代码)。但在您不想限制缓存大小的情况下,使用cache可能会使代码更清晰,因为没有限制的最近最少使用的缓存没有多大意义。

\n

  • 我不会说这是毫无意义的。为了方便起见,它只是“lru_cache(maxsize=None)”的包装。考虑到这就是它在许多情况下的使用方式,它使最终用户的代码更具可读性。 (3认同)