用Python装饰器优雅实现函数缓存
装饰器是Python中一项强大而优雅的特性,它允许在不修改原函数代码的情况下增加新功能。今天我们来探讨如何使用装饰器实现一个简单的函数缓存机制。
什么是函数缓存?
函数缓存是将函数调用结果存储起来,当使用相同参数再次调用时直接返回缓存结果,避免重复计算。这对于计算成本高、频繁调用的函数尤其有用。
实现代码
import functools
from typing import Dict, Any
def cache_decorator(func):
"""简单的缓存装饰器"""
cache: Dict[str, Any] = {
}
@functools.wraps(func)
def wrapper(*args, **kwargs):
# 创建缓存键
cache_key = str(args) + str(kwargs)
# 检查是否已有缓存
if cache_key in cache:
print(f"使用缓存结果: {cache_key}")
return cache[cache_key]
# 执行函数并缓存结果
result = func(*args, **kwargs)
cache[cache_key] = result
print(f"计算并缓存: {cache_key}")
return result
return wrapper
# 使用装饰器
@cache_decorator
def fibonacci(n: int) -> int:
"""计算斐波那契数列"""
if n <= 1:
return n
return fibonacci(n-1) + fibonacci(n-2)
# 测试
if __name__ == "__main__":
print(fibonacci(10)) # 首次计算
print(fibonacci(10)) # 使用缓存
代码解析
这个装饰器通过字典存储函数调用结果,缓存键由参数转换而来。functools.wraps确保装饰后的函数保留原函数的元数据。在递归调用场景中(如斐波那契数列),缓存能显著提升性能。
应用场景
- 计算密集型函数
- 数据库查询结果缓存
- API调用结果缓存
- 递归函数优化
Python标准库中的functools.lru_cache提供了更完善的实现,但理解其原理有助于我们更好地利用这一特性。装饰器的这种应用展现了Python“内置电池”哲学的魅力——用简洁的语法解决实际问题。