• python中的cachetools用法详解(Cached、LRUCache、TTLCache、LFUCache、RRCache)


    首先安装模块:

    pip install cachetools

    Cachetools提供了五个主要功能:

    • Cached
    • LRUCache
    • TTLCache
    • LFUCache
    • RRCache

    Cached

            cached用作装饰器。当我们调用缓存时,它会将函数缓存起来以备后用。默认情况下,这将执行一个简单的缓存。

    语法结构:

    1. @cached(cache = {})
    2. def some_fun():
    3. pass

    示例代码:  【使用时间模块来查看模块的效率】

    1. from cachetools import cached
    2. import time
    3. # without cached
    4. def fib(n):
    5. return n if n < 2 else fib(n - 1) + fib(n - 2)
    6. s = time.time()
    7. print(fib(36))
    8. print("Time Taken:", time.time() - s)
    9. # Now using cached
    10. s = time.time()
    11. # Use this decorator to enable caching
    12. @cached(cache={})
    13. def fib(n):
    14. return n if n < 2 else fib(n - 1) + fib(n - 2)
    15. print(fib(36))
    16. print("Time Taken(cached): ", time.time() - s)

    运行结果:

    LRUCache

            LRUCache在缓存装饰器内部使用。LRU 缓存是指“最近最少使用”的缓存。它接受一个参数“maxsize”,该参数说明应如何缓存最近的函数。

    语法结构:

    1. @cached(cache= LRUCache(maxsize= 3))
    2. def some_fun():
    3. pass

    示例代码:

    1. from cachetools import cached, LRUCache
    2. import time
    3. # cache using LRUCache
    4. @cached(cache=LRUCache(maxsize=3))
    5. def my_fun(n):
    6. # This delay resembles some task
    7. s = time.time()
    8. time.sleep(n)
    9. print("\nTime Taken: ", time.time() - s)
    10. return f"I am executed: {n}"
    11. # Takes 3 seconds
    12. print(my_fun(3))
    13. # Takes no time
    14. print(my_fun(3))
    15. # Takes 2 seconds
    16. print(my_fun(2))
    17. # Takes 1 second
    18. print(my_fun(1))
    19. # Takes 4 seconds
    20. print(my_fun(4))
    21. # Takes no time
    22. print(my_fun(1))
    23. # Takes 3 seconds because maxsize = 3
    24. # and the 3 recent used functions had 1,
    25. # 2 and 4.
    26. print(my_fun(3))

    运行结果:

    注意 LRUCache也可以从标准 Python 包 functools 中调用

    1. from functools import lru_cache
    2. @lru_cache
    3. def myfunc():
    4. pass

    TTLCache

            TTLCache或“Time To Live”缓存是 cachetools 模块中包含的第三个功能。它有两个参数——“maxsize”和“TTL”。“maxsize”的使用与 LRUCache 相同,但这里的“TTL”值表示缓存应存储多长时间。该值以秒为单位。

    语法结构:

    1. @cached(cache= TTLCache(maxsize= 33, ttl = 600))
    2. def some_fun():
    3. pass

    示例代码:

    1. from cachetools import cached, TTLCache
    2. import time
    3. # Here recent 32 functions
    4. # will we stored for 1 minutes
    5. @cached(cache=TTLCache(maxsize=32, ttl=25))
    6. def my_fun(n):
    7. # This delay resembles some task
    8. s = time.time()
    9. time.sleep(n)
    10. print("\nTime Taken: ", time.time() - s)
    11. return f"I am executed: {n}"
    12. print(my_fun(3))
    13. print(my_fun(3))
    14. print("*" * 100)
    15. time.sleep(24)
    16. print(my_fun(3))
    17. print("*" * 100)
    18. time.sleep(26)
    19. print(my_fun(3))

    运行结果:

    LFUCache

            LFUCache或“Least Frequently Used”缓存是另一种类型的缓存技术,用于检索项目被调用的频率。它会在必要时丢弃最不常调用的项目以腾出空间。它采用一个参数——“maxsize”,与 LRUCache 中的相同。

    语法结构:

    1. @cached(cache= LFUCache(maxsize= 33))
    2. def some_fun():
    3. pass

    示例代码:

    1. from cachetools import cached, LFUCache
    2. import time
    3. # Here if a particular item is not called
    4. # within 5 successive call of the function,
    5. # it will be discarded
    6. @cached(cache=LFUCache(maxsize=5))
    7. def my_fun(n):
    8. # This delay resembles some task
    9. s = time.time()
    10. time.sleep(n)
    11. print("\nTime Taken: ", time.time() - s)
    12. return f"I am executed: {n}"
    13. print(my_fun(3))
    14. print(my_fun(3))
    15. print(my_fun(2))
    16. print(my_fun(4))
    17. print(my_fun(1))
    18. print(my_fun(1))
    19. print(my_fun(3))
    20. print(my_fun(3))
    21. print(my_fun(4))

    运行结果:

    RRCache

            RRCache或“Random Replacement”缓存是另一种缓存技术,它随机选择缓存中的项目并在必要时丢弃它们以释放空间。它采用一个参数——“maxsize”,与 LRUCache 中的相同。它还有一个参数选择,默认设置为“random.choice”。

    语法结构:

    1. @cached(cache= RRCache(maxsize= 33))
    2. def some_fun():
    3. pass

    示例代码:

    1. from cachetools import cached, RRCache
    2. import time
    3. # Here if a particular item is not called
    4. # within 5 successive call of the function,
    5. # it will be discarded
    6. @cached(cache=RRCache(maxsize=5))
    7. def my_fun(n):
    8. # This delay resembles some task
    9. s = time.time()
    10. time.sleep(n)
    11. print("\nTime Taken: ", time.time() - s)
    12. return f"I am executed: {n}"
    13. print(my_fun(3))
    14. print(my_fun(3))
    15. print(my_fun(2))
    16. print(my_fun(4))
    17. print(my_fun(1))
    18. print(my_fun(1))
    19. print(my_fun(3))
    20. print(my_fun(2))
    21. print(my_fun(3))

    运行结果:

  • 相关阅读:
    x264交叉编译(ubuntu+arm)
    neo4j下载安装最新教程 2024.02
    Go学习之路:方法和接口(DAY 3)
    Qt5.12.12构建64位QMYSQL数据库驱动&“driver not loaded”
    极智AI | 算一算大模型显存占用
    想知道图片转表格怎么转?简单实用的转换方法分享
    简单易懂的 Go 泛型使用和实现原理介绍
    入门篇-其之六-附录一-以Java字节码的角度分析i++和++i
    什么是自主系统?
    《第一行代码》读书笔记(3)—Activity
  • 原文地址:https://blog.csdn.net/weixin_44799217/article/details/126110439