一、简介
使用functools.lru_cache
修饰符的函数,简单的理解为保存多次执行结果,当传入某一参数的执行结果已经执行过,则不会再一次执行而是直接返回结果。
二、语法
functools.lru_cache(maxsize=128, typed=False)
接受两个参数:
1.maxsize
:默认为128,表示保存使用functools.lru_cache
修饰符的函数最近执行结果的次数,会根据size大小逐步覆盖前期执行结果,被覆盖结果需要再次执行函数。
2. typed
:默认为False,表示不同数据类型保存在一起,True
,表示不同数据类型分开保存
三、案例
【sample】
In [1]: import functools
In [2]: @functools.lru_cache(3) # 传入3,表示只保存最近执行的3次结果
def test_func(a, b):
print("test_func: a=%d, b=%d" %(a, b))
return a+b
# 此时缓存中记录为空
In [3]: res = test_func(1,2) In [4]: res
Out[3]: test_func: a=1, b=2 Out[4]: 3
# 此时缓存保存传入参数 (1,2)执行结果
In [5]: res = test_func(3,4) In [6]: res
Out[5]: test_func: a=3, b=4 Out[6]: 7
# 此时缓存保存传入参数(1,2)、(3,4)执行结果
In [7]: res = test_func(5,6) In [8]: res
Out[7]: test_func: a=5, b=6 Out[8]: 11
# 此时缓存保存传入参数(1,2)、(3,4)、(5,6)执行结果
In [9]: res = test_func(1,2)
In[10]: res
Out[10]:3 # 最近3次的执行结果包含传入参数为1和2的情况,因此直接从缓存读取,不会再次执行,直接返回2
# 此时缓存保存传入参数(3,4)、(5,6)、(1,2)执行结果
In [11]: res = test_fun(7, 8) In [12]: res
Out[11]: test_func: a=7, b=8 Out[12]: 15
# 此时缓存保存传入参数(5,6)、(1,2)、(7,8)执行结果
# 最近3次的执行结果不包含传入参数为3和4的情况,因此需要再次执行函数
In [13] res = test_func(3,4) In [14]: res
Out[13]: test_func: a=3, b=4 Out[14]: 7
# 此时缓存保存传入参数(1,2)、(7,8)、(3,4)执行结果