• 函数记忆:python装饰器实现短时缓存方法执行结果


    # 【函数记忆】方法结果缓存装饰器
    cache = {}
    
    
    def is_obsolete(entry, duration):
        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):
        def _memorize(function):
            @wraps(function)  # update_wrapper维持被修饰函数属性不变
            def __memorize(*args, **kwargs):
                key = compute_key(function, args, kwargs)  # 方法名和传入的参数不同key会不同
    
                if key in cache:
                    if not is_obsolete(cache[key], duration):
                        print('%s 使用缓存' % function.__name__)
                        return cache[key]['value']
                    else:
                        print('%s 删除缓存' % function.__name__)
                        del cache[key]  # 删除过时缓存
    
                result = function(*args, **kwargs)
                cache[key] = {'value': result, 'time': time.time()}
                return result
    
            return __memorize
    
        return _memorize

    使用方法:

    @memoize(10)    
    def get_data_list(num, limit, skip):
        # data将会被缓存10秒,十秒内调用get_data_list方法将会使用缓存,10秒后将重新执行方法并再缓存10秒,以此类推...
      data = num + limit + skip
      return data     
     
  • 相关阅读:
    MFC的DoModal(转)
    MFC程序执行过程剖析(转)
    中控面试记录
    从内核文件系统看文件读写过程(转)
    dbutils工具
    java中求利息的代码
    java中求输入一个数,并计算其平方根~~~
    java中length的用法
    java中关于length的真确理解~~~~有补充的请跟帖~~~
    java二维数组的长度
  • 原文地址:https://www.cnblogs.com/mzfly/p/14573746.html
Copyright © 2020-2023  润新知