2k Star!cachetools:一款超好用的Python高效缓存管理工具

火山方舟向量数据库大模型

点击上方“蓝色字体”关注我,选择“设为星标”!

回复“电子书”领取超多经典计算机书籍

picture.image

引言

在现代软件开发中,缓存是提高应用程序性能的关键技术之一。

它通过减少对数据库、API或其他慢速数据源的重复查询,显著降低了系统的响应时间。

而Python的cachetools库提供了一个简单而强大的接口,用于实现各种缓存策略。

安装cachetools

cachetools可以通过Python的包管理工具pip进行安装。

在命令行中输入以下命令即可完成安装:

  
pip install cachetools

基本使用

cachetools提供了多种缓存策略,其中最常用的是使用 LRU缓存

下面是一个简单的LRU缓存使用示例:


   
from cachetools import LRUCache  
  
# 创建一个最大容量为10的LRU缓存  
cache = LRUCache(maxsize=10)  
  
# 向缓存中添加数据  
cache['key1'] = 'value1'  
cache['key2'] = 'value2'  
  
# 访问缓存中的数据  
print(cache['key1'])  # 输出: value1  
  
# 添加新数据,如果缓存已满,将移除最近最少使用的项  
cache['key3'] = 'value3'  
  
# 尝试访问一个不存在的键,将返回None  
print(cache.get('nonexistent'))  # 输出: None

当然我们最常用的是cachetools的装饰器用法,通常将其应用于函数缓存。自动处理函数的调用和缓存逻辑。

cachetools提供了一个名为cached 的装饰器,它可以用来缓存函数的结果。

这个装饰器接受几个参数,包括缓存的最大大小和可选的过期时间。

下面是一个使用cached装饰器的简单示例:


   
from cachetools import cached, LRUCache  
  
# 创建一个LRU缓存对象,最大容量为10  
cache = LRUCache(maxsize=10)  
  
# 定义一个简单的函数  
@cached(cache)  
def add(a, b):  
    return a + b  
  
# 调用函数,结果将被缓存  
print(add(2, 3))  # 输出: 5  
  
# 再次调用相同的函数,将直接从缓存中获取结果  
print(add(2, 3))  # 输出: 5(从缓存中获取)

应用场景

1. 计算密集型操作

计算密集型函数通常需要消耗大量的CPU资源。

通过使用cachetools的装饰器,我们可以避免重复计算,从而提高效率。


   
from math import sqrt  
from cachetools import cached  
  
@cached(cache=LRUCache(maxsize=100))  
def compute\_square\_root(n):  
    """计算并缓存一个数的平方根"""  
    return sqrt(n)  
  
# 第一次调用时会计算并缓存结果  
print(compute\_square\_root(25))  # 输出: 5.0  
  
# 后续调用将直接从缓存中获取结果  
print(compute\_square\_root(25))  # 输出: 5.0(从缓存中获取)

2. I/O密集型操作

I/O密集型操作,如文件读取或数据库查询,通常涉及等待外部资源,使用缓存可以显著减少这些操作的响应时间。


   
from cachetools import cached  
import time  
  
# 假设这是一个I/O密集型操作  
@cached(cache=LRUCache(maxsize=10))  
def read\_file(filename):  
    time.sleep(2)  # 模拟I/O操作耗时  
    with open(filename, 'r') as file:  
        return file.read()  
  
# 第一次调用时会模拟I/O操作并缓存结果  
print(read\_file('example.txt'))  # 输出文件内容,等待2秒  
  
# 后续调用将直接从缓存中获取结果,无需等待  
print(read\_file('example.txt'))  # 立即输出文件内容,无需等待

代码Demo

以下是上述应用场景的完整代码示例:


   
import time  
from cachetools import LRUCache, cached  
  
# 计算平方根的缓存函数  
@cached(cache=LRUCache(maxsize=100))  
def compute\_square\_root(n):  
    return n ** 0.5  
  
# 模拟I/O操作的缓存函数  
@cached(cache=LRUCache(maxsize=10))  
def simulate\_io\_operation():  
    time.sleep(2)  # 模拟耗时的I/O操作  
    return "Result of I/O operation"  
  
# 测试计算平方根的缓存函数  
print(compute\_square\_root(16))  # 第一次调用,计算并缓存结果  
time.sleep(1)  # 等待1秒  
print(compute\_square\_root(16))  # 再次调用,从缓存中获取结果  
  
# 测试模拟I/O操作的缓存函数  
print(simulate\_io\_operation())  # 第一次调用,模拟I/O操作并缓存结果  
time.sleep(1)  # 等待1秒  
print(simulate\_io\_operation())  # 再次调用,从缓存中获取结果,无需等待

通过这些示例,我们可以看到cachetools如何帮助我们在不同的场景下实现高效的缓存管理。

小结

cachetools是一个功能强大且易于使用的Python缓存库。

它支持多种缓存策略,如LRU、TTL等,并且可以轻松集成到各种应用场景中,如数据库查询缓存、API请求缓存等。

通过它可以显著提高计算密集型和I/O密集型操作的性能。而装饰器的使用使得缓存逻辑与业务逻辑分离,代码更加清晰,易于维护。

picture.image

写到最后

感谢您的一路陪伴,用代码构建世界,一起探索充满未知且奇妙的魔幻旅程。如果您对Python编程技巧、好玩实用的开源项目、行业新知趣事和各类技术干货等充满兴趣,那么不要错过未来我为大家奉上的精彩内容!点击 关注 , 让您的探索学习之旅更加丰富多彩,我们一同成长,一同前行! 🚀💻📚

求一键三连 点赞、转发、在看

↓推荐关注↓

公众号内回复关键字“ 电子书 ”领取PDF格式的电子书籍( Python入门、异步编程、网络爬虫、高性能编程、数据分析与挖掘实战、Spring、Linux、CSS、VUE、自动化测试、程序员面试宝典 等)。

picture.image

四款国内外远程桌面软件横测:ToDesk、向日葵、TeamViewer、AnyDesk

新一代开源语音库CoQui TTS冲到了GitHub 20.5k Star

● 最新最全 VSCODE 插件推荐(2023版)

狂揽16.9k star!Umi-OCR文字识别太火了,解决了多少人的痛点!

Python3 新一代Http请求库Httpx使用(详情版)

picture.image

如果本文对您有帮助,也请帮忙点个 赞👍 + 在看 哈!❤️

在看你就赞赞我!

picture.image

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
云原生机器学习系统落地和实践
机器学习在字节跳动有着丰富业务场景:推广搜、CV/NLP/Speech 等。业务规模的不断增大对机器学习系统从用户体验、训练效率、编排调度、资源利用等方面也提出了新的挑战,而 Kubernetes 云原生理念的提出正是为了应对这些挑战。本次分享将主要介绍字节跳动机器学习系统云原生化的落地和实践。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论