zoukankan      html  css  js  c++  java
  • 函数记忆: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     
     
  • 相关阅读:
    sys_check
    python I/O 多路复用
    记一次刻骨铭心的值班失误
    RBAC用户角色权限设计方案【转载】
    国内maven镜像
    Hibernate 以流的方式获取数据
    Eclipse Maven Project
    spring maven pom
    git 常用操作
    Shell上传文件到ftp
  • 原文地址:https://www.cnblogs.com/mzfly/p/14573746.html
Copyright © 2011-2022 走看看