page contents

Python中这6个函数缓存技巧,lru_cache不是唯一选择!

在Python编程中,函数缓存是一种优化技术,它可以显著提高程序的执行效率,尤其是在处理重复计算或耗时操作时。虽然lru_cache是Python标准库中最常用的缓存工具,但它并不是唯一的选择。今天,我们将深入探讨6种不同的函数缓存技巧,帮助你更好地理解和使用这些工具。
attachments-2025-05-d5KL7we5681ab7b82f5d4.jpg在Python编程中,函数缓存是一种优化技术,它可以显著提高程序的执行效率,尤其是在处理重复计算或耗时操作时。虽然lru_cache是Python标准库中最常用的缓存工具,但它并不是唯一的选择。今天,我们将深入探讨6种不同的函数缓存技巧,帮助你更好地理解和使用这些工具。
1. functools.lru_cache
lru_cache是Python标准库functools模块中的一个装饰器,它实现了最近最少使用(LRU)缓存策略。这个装饰器可以缓存函数的结果,当函数再次被调用时,如果参数相同,则直接返回缓存的结果,而不需要重新计算。
from functools import lru_cache

@lru_cache(maxsize=128)
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(10)) # 输出: 55
解释:lru_cache通过maxsize参数来限制缓存的大小。当缓存达到最大容量时,最近最少使用的缓存项会被移除。这个例子中,fibonacci函数的结果被缓存,避免了重复计算。
2. functools.cache
cache是Python 3.9引入的一个简单缓存装饰器,它没有大小限制,适用于需要缓存所有结果的场景。
from functools import cache

@cache
def factorial(n):
    if n == 0:
        return 1
    return n * factorial(n-1)

print(factorial(5)) # 输出: 120
解释:cache装饰器会缓存所有函数调用的结果,适用于那些参数范围有限且结果不会无限增长的函数。
3. 自定义缓存装饰器
如果你需要更灵活的缓存策略,可以自己实现一个缓存装饰器。下面是一个简单的实现:
def custom_cache(func):
    cache = {}
    def wrapper(*args):
        if args in cache:
            return cache[args]
        result = func(*args)
        cache[args] = result
        return result
    return wrapper

@custom_cache
def add(a, b):
    return a + b

print(add(2, 3)) # 输出: 5
print(add(2, 3)) # 输出: 5 (从缓存中获取)
解释:这个自定义缓存装饰器使用了一个字典来存储函数的结果。当函数被调用时,首先检查参数是否在缓存中,如果在则直接返回缓存的结果,否则计算结果并存入缓存。
4. joblib.Memory
joblib是一个用于并行计算的库,它提供了一个Memory类,可以将函数的结果缓存到磁盘上,适合处理大数据或长时间运行的任务。
from joblib import Memory

memory = Memory(location='/tmp/cache', verbose=0)

@memory.cache
def expensive_computation(x):
    return x ** 2

print(expensive_computation(4)) # 输出: 16
解释:Memory类将函数的结果缓存到指定的目录中,即使程序重启,缓存仍然有效。这对于需要长时间运行的计算任务非常有用。
5. diskcache
diskcache是一个将缓存存储在磁盘上的库,适合处理大量数据或需要持久化缓存的场景。
import diskcache as dc

cache = dc.Cache('/tmp/diskcache')

@cache.memoize()
def multiply(a, b):
    return a * b

print(multiply(3, 4)) # 输出: 12
解释:diskcache将缓存存储在磁盘上,适合处理大量数据或需要持久化缓存的场景。meoize装饰器会自动将函数的结果缓存到磁盘。
6. fastapi.Cache
如果你在使用FastAPI框架,可以使用fastapi.Cache来缓存API的响应结果。
from fastapi import FastAPI, Request
from fastapi_cache import FastAPICache
from fastapi_cache.backends.inmemory import InMemoryBackend
from fastapi_cache.decorator import cache

app = FastAPI()

@app.on_event("startup")
asyncdef startup():
    FastAPICache.init(InMemoryBackend())

@app.get("/items/{item_id}")
@cache(expire=60)
asyncdef read_item(item_id: int):
    return {"item_id": item_id}

# 启动FastAPI应用后,访问`/items/1`,结果会被缓存60秒。
解释:fastapi.Cache可以缓存API的响应结果,适合在Web应用中使用。expire参数指定了缓存的过期时间。
实战案例:缓存API响应
假设我们有一个API,它从外部服务获取数据。由于外部服务的响应时间较长,我们可以使用缓存来优化性能。
import requests
from fastapi import FastAPI
from fastapi_cache import FastAPICache
from fastapi_cache.backends.inmemory import InMemoryBackend
from fastapi_cache.decorator import cache

app = FastAPI()

@app.on_event("startup")
asyncdef startup():
    FastAPICache.init(InMemoryBackend())

@app.get("/external-data/{data_id}")
@cache(expire=300)
asyncdef get_external_data(data_id: int):
    response = requests.get(f"https://api.example.com/data/{data_id}")
    return response.json()

# 启动FastAPI应用后,访问`/external-data/1`,结果会被缓存5分钟。
分析:在这个案例中,我们使用fastapi.Cache来缓存外部API的响应结果。由于外部API的响应时间较长,缓存可以显著提高API的性能。expire参数设置为300秒,意味着缓存将在5分钟后过期。
总结
本文介绍了6种不同的函数缓存技巧,包括lru_cache、cache、自定义缓存装饰器、joblib.Memory、diskcache和fastapi.Cache。每种方法都有其适用的场景,选择合适的缓存策略可以显著提高程序的性能。通过实际代码示例,我们展示了这些缓存技巧的应用,并分析了它们的工作原理和优势。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

  • 发表于 2025-05-07 09:30
  • 阅读 ( 51 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
小柒
小柒

2140 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 2140 文章
  3. Pack 1303 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章