在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()