• 让你的Python健步如飞的小技巧


    • 缓存是一项从底层到高层都会广泛应用的技术,无论是前端还是后端。缓存是可以进行高速数据交换的存储器,它先于内存与CPU交换数据,因此速率很快。
    • 在python开发过程中,有一些函数的结果可能会被反复调用,如果这个函数耗时过大,那么我们如何通过缓存来提升他的开发效率呢?

    LRU缓存

    • 本文就来介绍一下LRU缓存到底是个什么鬼。

    • 不同的编程语言,会有不同的缓存策略。例如,通过哈希映射优先级队列等实现缓存。因此,不同的编程语言,在缓存的解决方案面有很大的差异。

    • 但是,在Python中,标准工具包functools实现了一种名为LRU(Least Recently Used)的缓存策略,可以通过传入参数,来设定缓存最近多少次的计算结果,如果传入参数设为None,那么会进行无限缓存。

    Talk is Cheap, Show me the Code

    • 同学们,下面我们就举一个斐波那契数列的例子,看看LRU在递归问题上面的表现
    # 先来一个不用LRU的例子
    
    import time 
    import functools
    
    
    def fib(n):
      if n <= 1:
        return n 
      return fib(n - 1) + fib(n - 2)
    
    t1 = time.time()
    fib(30)
    print(f"time take {time.time() - t1}s")
    # time take 0.3282461166381836s
    
    # 使用LRU
    
    import time 
    import functools
    
    @functools.lru_cache(maxsize=5)
    def fib(n):
      if n <= 1:
        return n
      return fib(n - 1) + fib(n - 2)
    
    t2 = time.time()
    fib(30)
    print(f"time take {time.time() - t2}s")
    # time take 1.7881393432617188e-05s
    
    • 来,同学们,见证奇迹的时刻到了。根据两个耗时对比,利用缓存的计算速度高了不止一个量级。

    总结

    • 在日常工作中,如果需要有对程序进行相应的优化,那么考虑一下LRU缓存,经济又实惠。
    • 计算密集型的程序,条件允许的话,尽量使用LRU缓存技术。
  • 相关阅读:
    【PA2014】【BZOJ3709】Bohater(贪心,排序)
    【POJ1328】Radar Installation(贪心,决策包容)
    【NOIP2002】【Luogu1032】字串变换
    【NOIP2010】【Luogu1199】三国游戏
    【NOIP2009】【Luogu1068】分数线划定
    【NOIP2002】【Luogu1036】选数
    【NOIP2004】【Luogu1085】不高兴的津津
    【NOIP2003】【luogu1042】乒乓球
    【NOIP2012】【Luogu1080】国王游戏(贪心,邻项交换)
    Jzoj4894 SJR的直线
  • 原文地址:https://www.cnblogs.com/zcg921001/p/13338606.html
Copyright © 2020-2023  润新知