【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风格。

相关推荐
捕鲸叉2 分钟前
创建线程时传递参数给线程
开发语言·c++·算法
Devil枫3 分钟前
Vue 3 单元测试与E2E测试
前端·vue.js·单元测试
A charmer6 分钟前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq9 分钟前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
阡之尘埃36 分钟前
Python数据分析案例61——信贷风控评分卡模型(A卡)(scorecardpy 全面解析)
人工智能·python·机器学习·数据分析·智能风控·信贷风控
尚梦37 分钟前
uni-app 封装刘海状态栏(适用小程序, h5, 头条小程序)
前端·小程序·uni-app
GIS程序媛—椰子1 小时前
【Vue 全家桶】6、vue-router 路由(更新中)
前端·vue.js
记录成长java2 小时前
ServletContext,Cookie,HttpSession的使用
java·开发语言·servlet
前端青山2 小时前
Node.js-增强 API 安全性和性能优化
开发语言·前端·javascript·性能优化·前端框架·node.js
睡觉谁叫~~~2 小时前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust