from functools import wraps
import time, inspect
import datetime
import time
def logger(fn): # 此装饰器是查看函数运行用了多长时间
@wraps(fn)
def wrapper(*args, **kwargs):
start = datetime.datetime.now()
ret = fn(*args, **kwargs)
delta = (datetime.datetime.now() - start).total_seconds()
print(fn.__name__, delta)
return ret
return wrapper
def cached(druation):
def _cached(fn):
local_cache = {} # 建立缓存字典
@wraps(fn)
def wrapper(*args, **kwargs):
expire_keys = []
for k, (_, stamp) in local_cache.items():
now = datetime.datetime.now().timestamp()
if now - stamp > druation:
expire_keys.append(k)
for k in expire_keys:
local_cache.pop(k)
sig = inspect.signature(fn)
params = sig.parameters
keys_dict = {} # 建立字典收集参数
keys_dict.update(zip(params.keys(), args)) # 取出有序位置参数
keys_dict.update(kwargs) # 取出关键字参数
for k, v in params.items(): # 实参未传入,用缺省参数
if k not in keys_dict:
keys_dict[k] = v.default
key = tuple(sorted(keys_dict.items())) # 把参数字典的键值对做为key,传入缓存字典
if key not in local_cache: # 把缓存字典中是否有key 没有则追加 计算后的值,作为缓存用
local_cache[key] = (fn(*args, **kwargs), datetime.datetime.now().timestamp()) # 用时间戳记录时间
return key, local_cache[key]
return wrapper
return _cached
@logger
@cached(5)
def add(x, y, z=8):
time.sleep(1)
v = x + y + z
print(v)
return
用python实现一个缓存,记录函数运行多长时间和缓存过期代码
最新推荐文章于 2024-05-01 15:24:52 发布