python标准库中的functools模块,提供了functools.lru_cache,基于内存的缓存。
基于内存缓存
lru_cache
from functools import lru_cache
@lru_cache(maxsize=1)
def sum2(a,b):
print(f"计算{a}+{b} ... ")
return a+b
print(sum2(2,3))
print(sum2(2,3))
print(sum2(4,7))
print(sum2(4,7))
print(sum2(2,3))
print(sum2(4,7))
maxsize=1,表示可以缓存的元素的个数。
改变maxsize的值为2,再切换为1,运行程序观察输出结果.
sum2.cache_info() #查看缓存性能
sum2.cache_clear() #清除缓存
基于磁盘的缓存
joblib
"""
教程 https://joblib.readthedocs.io/en/latest/memory.html
安装 pip install joblib
"""
from joblib import Memory
memory = Memory(location="./cachedir")
@memory.cache
def sum2(a,b):
print(f"计算{a}+{b} ... ")
return a+b
print(sum2(2,3))
print(sum2(2,3))
print(sum2(4,7))
print(sum2(4,7))
print(sum2(2,3))
print(sum2(4,7))
两个一起用,内存+硬盘缓存
二级缓存 双重缓存
import time
import random
from functools import lru_cache
from joblib import Memory
memory = Memory(location="cachedir")
@lru_cache(maxsize=5)
@memory.cache
def sum2(arg):
time.sleep(1)
list1 = [0,1,2]
a = random.choice(list1)
arg = 1/a
return arg
if __name__ == "__main__":
while True:
for i in ["a1","b2","e3",'d4','e5']:
arg = i
t0 = time.time()
try:
res = sum2(arg)
print("+++++++++++++++++++++++++++++++++++")
print(i,res,"sum2 cost",time.time()-t0)
print("+++++++++++++++++++++++++++++++++++")
except:
print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
input_str = input("继续 or 结束")
if input_str == 'q':
break