📜  在Python中清除 LRU 缓存

📅  最后修改于: 2022-05-13 01:54:21.754000             🧑  作者: Mango

在Python中清除 LRU 缓存

LRU是最近最少使用的缓存。 LRU Cache是一种高速内存,用于加快常用数据的检索速度。它是在 Queue 和 Hash 数据结构的帮助下实现的。

注意:更多信息请参考Python – LRU 缓存

如何与Python中的 LRU 缓存进行交互?

从Python 3.2 开始,Python 的functool模块提供了与 LRU 缓存交互的功能。 functool 模块提供了一个装饰器,可以放置在Python中函数的类之上。当用于需要大量变量访问和更改操作的功能时,使用 LRU 缓存可提供巨大的加速。

例子:

import functools
  
@functools.lru_cache(maxsize = None)
def gfg():
    # insert function logic here
    pass

或者,可以更改最大尺寸以适合自己的喜好。该值以 kbs 为单位,maxsize 采用整数参数

清除 LRU 缓存

使用缓存后,可以使用 cache_clear() 来清除缓存或使缓存失效。

示例 1:

import functools
   
@functools.lru_cache(maxsize = None)
def fib(n): 
    if n < 2: 
        return n 
    return fib(n-1) + fib(n-2)
  
fib(30)
  
# Before Clearing
print(fib.cache_info())
  
fib.cache_clear()
  
# After Clearing
print(fib.cache_info())

输出:

CacheInfo(hits=28, misses=31, maxsize=None, currsize=31)
CacheInfo(hits=0, misses=0, maxsize=None, currsize=0)

示例 2:此外,也可以从另一个函数调用 cache_clear()

import functools
   
@functools.lru_cache(maxsize = None)
def fib(n): 
    if n < 2: 
        return n 
    return fib(n-1) + fib(n-2)
  
def gfg():
    fib.cache_clear()
  
fib(30)
  
# Before Clearing
print(fib.cache_info())
  
gfg()
  
# After Clearing
print(fib.cache_info())

输出:

CacheInfo(hits=28, misses=31, maxsize=None, currsize=31)
CacheInfo(hits=0, misses=0, maxsize=None, currsize=0)

这些方法有局限性,因为它们是个性化的,并且必须为每个使用该函数。我们可以克服这个问题,通过使用 Python 内置的垃圾收集模块来收集所有具有 LRU Cache Wrappers 的对象,并迭代地清除每个对象的缓存。

例子:

import gc
import functools
  
@functools.lru_cache(maxsize = None)
def gfg():
    # insert function logic here
    pass
  
@functools.lru_cache(maxsize = None)
def gfg1():
    # insert function logic here
    pass
  
@functools.lru_cache(maxsize = None)
def gfg2():
    # insert function logic here
    pass
  
gfg()
gfg1()
gfg2()
  
gc.collect()
  
# All objects collected
objects = [i for i in gc.get_objects() 
           if isinstance(i, functools._lru_cache_wrapper)]
  
# All objects cleared
for object in objects:
    object.cache_clear()