【Python】提高函数调用效率:使用缓存装饰器实现简单的记忆化

缓存是一种避免重复计算和加速程序运行的常用技术。

幸运的是,在大多数情况下,我们不需要编写自己的缓存代码,因为Python已经提供了一个现成的解决方案------@functools.cache装饰器。

例如,以下代码展示了两个斐波那契数列生成函数的对比,其中一个应用了缓存装饰器,另一个则没有:


python 复制代码
import timeit
import functools

def fibonacci(n):
    if n in (0, 1):
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)

@functools.cache
def fibonacci_cached(n):
    if n in (0, 1):
        return n
    return fibonacci_cached(n - 1) + fibonacci_cached(n - 2)

# Test the execution time of each function
print(timeit.timeit(lambda: fibonacci(30), number=1))
# 0.09499712497927248
print(timeit.timeit(lambda: fibonacci_cached(30), number=1))
# 6.458023563027382e-06

测试结果清楚地展示了functools.cache装饰器是如何使我们的代码运行得更快的。

普通的fibonacci函数效率不高,特别是在计算诸如fibonacci(30)这样的结果时,它会重复计算多次相同的斐波那契数。

而使用了缓存的版本则显著加快了计算速度,原因是它缓存了之前计算的结果。这意味着每个斐波那契数只计算一次,之后相同参数的调用会直接从缓存中获取结果。

只需简单添加一个内置的装饰器,就能实现这样显著的性能提升,这正是典型的Pythonic风格。

相关推荐
夜晚回家6 小时前
Python 身份运算符详解 | is 与 == 到底差在哪
python
fengye2071616 小时前
cpython框架结构
python
Lank_M7 小时前
视频压到指定大小总超一截?码率控制的误差拆开看
前端
用户2054555788007 小时前
飞书运费台账同步到 MySQL:单一策略落地教程
前端
LEE7 小时前
别把 Agent 架构画成组织架构图——子代理该不该拆,用任务级 Eval 说话
前端·后端·ai编程
梦醒江南7 小时前
RAG 证据链验收:别只测答案像不像,要证明它从哪里来
前端·agent·ai编程
用户91294046848427 小时前
大模型返回 JSON 后,先过这道 Python 校验
python
费曼学习法7 小时前
无人值守AI内容矩阵实战(8):把标题 A/B 实验做成可判胜的流水线
前端
Dmz丶7 小时前
前端转 AI 100 天 Day 32:LLM 客户端工程化——重试、超时、降级、限流
python
lemon_yyds7 小时前
vue 实现轮播 - 一张半效果
前端