内存缓存简单实现(Python)

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



评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时越zz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值