import time, inspect, datetime
from functools import wraps
from inspect import Parameter
def logger(fn):
@wraps(fn)
def wrapper(*args, **kwargs):
time1 = datetime.datetime.now()
ret = fn(*args, **kwargs)
time2 = (datetime.datetime.now() - time1).total_seconds()
print(f"所需时间:{time2}")
return ret
return wrapper
def past(parm_dict, dtime):
parm_list = []
for k, (_, v) in parm_dict.items():
now = datetime.datetime.now().timestamp()
if now - v > dtime:
parm_list.append(k)
for i in parm_list:
parm_dict.pop(i)
def _key(args, kwargs, _dict, fn):
total = {}
sig = inspect.signature(fn)
parm = sig.parameters
# key 值
total.update(zip(parm.keys(), args), **kwargs)
# 缺省值
for k, v in parm.items():
if k not in total.keys():
total[k] = v.default
key = tuple(sorted(total.items()))
return key
def cache(dtime=5):
def _cache(fn):
parm_dict = {}
@wraps(fn)
def wrapper(*args, **kwargs):
# 判断时间是否过期
past(parm_dict, dtime)
key = _key(args, kwargs, parm_dict, fn)
# 判断是否缓存
if key not in parm_dict.keys():
parm_dict[key] = fn(*args, **kwargs), datetime.datetime.now().timestamp()
return parm_dict[key][0]
return wrapper
return _cache
@logger
@cache()
def add(x:int=4, y:int=5) -> int:
time.sleep(2)
return x + y
内存缓存简单实现(Python)
最新推荐文章于 2024-06-26 13:48:20 发布