Python LRU 缓存的全局和每个实例的行为差异

Red*_*war 5 python caching lru python-3.x

我正在研究Python 的 LRU 缓存装饰器的实现细节。为了正确理解装饰器在不同场景中的行为lru_cache,我还浏览了以下答案:

\n\n

到目前为止,我可以看出这三种情况下的缓存行为是不同的:

\n
    \n
  1. 装饰全局命名空间中的函数。
  2. \n
  3. 装饰类中的实例方法。
  4. \n
  5. 装饰类中的方法,稍后用staticmethodorclassmethod装饰器装饰。
  6. \n
\n

第一种情况是快乐路径,其中用lru_cache装饰器装饰的每个函数都有自己的缓存。这已经有据可查。在第二种情况下,缓存在类的多个实例之间共享,其中每个实例对于实例方法的相同参数将具有不同的键。这在我列出的最后一个问题中得到了很好的解释。在第三种情况下,缓存也在封装类的多个实例之间共享。但是,由于静态方法或类方法不将self其作为第一个参数,因此类的实例不会为相同的参数创建单独的缓存条目。

\n

我的问题是\xe2\x80\x94什么实现细节定义了这种行为?在函数的实现中lru_cache,我只能看到函数内部的本地缓存字典_lru_cache_wrapper正在保存缓存条目。这是片段:

\n
def _lru_cache_wrapper(user_function, maxsize, typed, _CacheInfo):\n    \n    sentinel = object()          \n    make_key = _make_key         \n    PREV, NEXT, KEY, RESULT = 0, 1, 2, 3   \n\n    cache = {} # This is a local dict, \n               # then how come the instance cache entries are shared?\n
Run Code Online (Sandbox Code Playgroud)\n

我不明白的是,当装饰lru_cache器应用于类中的方法时,如何在类的实例之间共享本地缓存字典?我期望它的行为与第一种情况相同,其中每个实体都有自己的缓存并且没有任何内容是共享的。

\n