用装饰器缓存某个函数的结果

import time
import hashlib
import pickle

cache = {}


def is_obsolete(entry, duration):   # 判断缓存是否过期,返回True则过期
    d = time.time() - entry['time']
    return d > duration


def compute_key(function, args, kwargs):    # 将传入的参数序列化
    key = pickle.dumps((function.__name__, args, kwargs))
    return hashlib.sha1(key).hexdigest()


def memoize(duration=10):   # 装饰器中缓存时间默认为10秒
    def _memorize(function):    # 第二层传函数
        def __memorize(*args, **kwargs):    # 第三层传入非固定参数
            key = compute_key(function, args, kwargs)
            if key in cache and not is_obsolete(cache[key], duration):
                print('we got a winner', end='  ')
                return cache[key]['value']  # 如果缓存中有,就直接返回缓存过的结果
            result = function(*args, **kwargs)
            cache[key] = {'value': result, 'time': time.time()}
            print(cache)
            return result
        return __memorize
    return _memorize


@memoize(100)
def complex(a,b):
    time.sleep(1)
    return a+b
while True:
    a=int(input('请输入a: '))
    b=int(input('请输入b: '))
    print(complex(a, b))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值