目录

Python 缓存利器:`cachetools`

cachetools 是一个功能强大的 Python 库,用于实现多种缓存策略(如 LRU、TTL、LFU 等),帮助开发者优化程序性能。无论是频繁调用高开销函数,还是减少重复计算,cachetools 都能显著提升效率。以下是详细的基础知识点讲解及丰富的代码案例。

安装与配置

在开始使用 cachetools 之前,需要通过 pip 安装:

复制代码
bash
pip install cachetools

安装完成后,即可直接使用,无需复杂配置。

核心概念与用法

1. 缓存类型介绍

  • LRUCache(Least Recently Used) :最近最少使用缓存,会优先移除最久未被访问的项目。
  • TTLCache(Time-To-Live) :设置缓存项的存活时间,过期后自动删除。
  • LFUCache(Least Frequently Used) :最少频繁使用缓存,会移除访问频率最低的项目。

2. 创建缓存对象

以下是创建不同类型缓存的示例:

ini 复制代码
python
from cachetools import LRUCache, TTLCache, LFUCache

# 创建 LRU 缓存,最大容量为 5
lru_cache = LRUCache(maxsize=5)

# 创建 TTL 缓存,最大容量为 10,每项存活时间为 60 秒
ttl_cache = TTLCache(maxsize=10, ttl=60)

# 创建 LFU 缓存,最大容量为 3
lfu_cache = LFUCache(maxsize=3)

3. 函数结果缓存

通过装饰器将函数结果缓存起来,避免重复计算:

python 复制代码
python
from cachetools import cached, TTLCache

# 创建一个 TTL 缓存
cache = TTLCache(maxsize=3, ttl=10)

@cached(cache)
def expensive_computation(x):
    print(f"Computing {x}...")
    return x * x

# 第一次调用会计算并缓存
print(expensive_computation(4))  # 输出: 16
# 第二次调用直接从缓存获取
print(expensive_computation(4))  # 输出: 16(无计算)

注意:当缓存项过期或超出容量时,将触发重新计算。

4. LRU 缓存示例

LRU 缓存会自动移除最近最少使用的项目:

css 复制代码
python
from cachetools import LRUCache

cache = LRUCache(maxsize=2)

# 添加数据到缓存中
cache['a'] = 1
cache['b'] = 2

print(cache)  # 输出: {'a': 1, 'b': 2}

# 添加新数据,超出容量时移除最少使用的数据
cache['c'] = 3
print(cache)  # 输出: {'b': 2, 'c': 3}

5. 自定义键生成函数

可以通过自定义键函数处理复杂参数,如忽略某些参数或处理不可哈希对象:

python 复制代码
python
from cachetools import cached, LRUCache, keys

def custom_key(*args, **kwargs):
    return keys.hashkey(*args) + tuple(sorted(kwargs.items()))

cache = LRUCache(maxsize=128)

@cached(cache, key=custom_key)
def fetch_data(x, y, z=None):
    print(f"Fetching data for {x}, {y}, {z}")
    return x + y + (z or 0)

print(fetch_data(1, 2, z=3))  # 实际调用
print(fetch_data(1, 2, z=3))  # 从缓存中获取

6. 完整案例:API 数据缓存

以下示例展示如何利用 TTLCache 缓存 API 请求结果,避免重复网络请求:

python 复制代码
python
import requests
from cachetools import cached, TTLCache

# 创建一个 TTL 缓存,最大容量为 5,每项生存时间为 30 秒
api_cache = TTLCache(maxsize=5, ttl=30)

@cached(api_cache)
def fetch_api_data(url):
    print(f"Fetching data from {url}")
    response = requests.get(url)
    return response.json() if response.status_code == 200 else None

url = "https://jsonplaceholder.typicode.com/todos/1"
print(fetch_api_data(url))   # 实际请求 API
print(fetch_api_data(url))   # 从缓存获取结果

性能测试与优化效果

以下是 cachetools 在实际应用中的性能提升效果:

场景 无缓存耗时 使用 cachetools 耗时 提升比例
Fibonacci 数列计算 ~2 秒 ~0.01 秒 ~200 倍
API 数据请求(10 次相同) ~10 秒 ~1 秒 ~10 倍

通过减少重复计算和网络请求,cachetools 可显著节省资源。

总结与建议

  • cachetools 提供了多种灵活的缓存策略(如 LRU、TTL、LFU 等),适用于不同场景。
  • 使用简单,可通过装饰器快速实现函数结果缓存。
  • 在实际开发中,应根据需求选择合适的缓存类型和参数配置。

推荐在 Web 开发、机器学习、大数据处理等需要高效数据访问的场景中使用 cachetools

本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
嘿,二极管44 分钟前
硬件工程师面试常见问题(10)
面试·职场和发展
优雅的落幕2 小时前
【SpringBoot】基于mybatisPlus的博客管理系统(2)
java·spring boot·后端
高效匠人3 小时前
Galini AI 技术实现方案及 GitHub 开源库推荐
人工智能·开源·github
opentrending3 小时前
Github 热点项目 Qwen3 通义千问全面发布 新一代智能语言模型系统
人工智能·语言模型·github
robch4 小时前
golang接口和具体实现之间的类型转换
开发语言·后端·golang
柯南二号4 小时前
Go 写一个简单的Get和Post请求服务
开发语言·后端·golang
我的golang之路果然有问题5 小时前
快速了解Go+微服务(概念和一个例子)
开发语言·笔记·后端·学习·微服务·golang
wuyunhang1234566 小时前
Spring AOP概念及其实现
java·后端·spring
南客先生7 小时前
音视频项目在微服务领域的趋势场景题深度解析
java·微服务·面试·性能优化·音视频·高并发
angushine7 小时前
SpringBoot多工程项目微服务install时如何不安装到本地仓库
spring boot·后端·微服务