美文网首页Python全栈工程师
18.3-lru_cache 缓存装饰器

18.3-lru_cache 缓存装饰器

作者: BeautifulSoulpy | 来源:发表于2019-09-18 16:51 被阅读0次

    人们总说时间会改变一切,但是实际上你需要自己努力去改变!

    本质:是函数调用的参数 => 返回值

    lru_cache

    最近最少使用缓存装饰器,内存不够就清理,内存够就暂时放到那里不清理;在python自带的functools库中

    根据参数缓存每次函数调用结果,对于相同参数的,无需重新函数计算,直接返回之前缓存的返回值;

    1. 如果maxsize设置为None,则禁用LRU功能,并且缓存可以无限制增长;当maxsize是2的幂时,LRU功能执行得最好;
    2. 如果 typed设置为True, 则不同类型的函数参数将单独缓存。例如,f(3)和f(3.0)将被视为具有不同结果的不同调用;
    3. 缓存是有内存存储空间限制的;
    from functools import lru_cache
    import time
    
    def a(x=3):
        time.sleep(3)
        print(x)
        return x+1
    
    print(a())
    print(a())
    ---------
    3
    4
    3
    4
    
    @lru_cache()
    def a(x=3):
        time.sleep(3)
        print(x)
        return x+1
    
    print(a(x=4))
    print(a())
    --------------------------------
    4
    5
    3
    4
    
    print(a(4))  # a(x=4) a(5) 都不一样,要重新开始算
    print(a())
    ------------------------
    4
    5
    3
    4
    
    
    例2:
    from functools import lru_cache
    import time
    
    @lru_cache()
    def add(x=4,y=5):
        time.sleep(3)
        return x+1
    
    print(1,add(4,5))  #第1次,都缓存3秒;计算结果;
    print(2,add(4))
    print(3,add(y=5))
    print(4,add(x=4,y=5))
    print(5,add(y=5,x=4))
    --------------------------------
    1 5
    2 5
    3 5
    4 5
    5 5
    
    print(1,add(4,5))  #第2次,直接从缓存中提取结果
    print(2,add(4))
    print(3,add(y=5))
    print(4,add(x=4,y=5))
    print(5,add(y=5,x=4))
    --------------------------------
    1 5
    2 5
    3 5
    4 5
    5 5
    
    print(1,add(4.0,5))
    ----------------------------------
    1 5
    

    缓存数据是并不一定快;看缓存的代价;缓存的时效大小;

    redius:
    缓存与缓冲:cache 与 buffer

    fib序列的改造
    # 多次调用递归会很慢
    def fibonacci(n):
        if n==1:
            return 1
        elif n==2:
            return 1
        elif n>2:
            return fibonacci(n-1)+fibonacci(n-2)
    
    for i in range(1,101):
        print(i,":",fibonacci(i)) 
    
    
    解决办法1:记忆法
    fibonacci_dic={}
    
    def fibonacci(n):
        if n in fibonacci_dic:
            return fibonacci_dic[n]
        if n==1:
            value= 1
        elif n==2:
            value= 1
        elif n>2:
            value=fibonacci(n-1)+fibonacci(n-2)
        fibonacci_dic[n]=value
        return value
    
    for i in range(1,101):
        print(i,":",fibonacci(i))
    
    解决办法2:装饰符
    from functools import lru_cache
    @lru_cache(maxsize=1000)
    def fibonacci(n):
        if n==1:
            return 1
        elif n==2:
            return 1
        elif n>2:
            return fibonacci(n-1)+fibonacci(n-2)
    
    for i in range(1,101):
        print(i,":",fibonacci(i)) 
    

    相关文章

      网友评论

        本文标题:18.3-lru_cache 缓存装饰器

        本文链接:https://www.haomeiwen.com/subject/pqlkuctx.html