同理,让我们看看 Web 后端开发框架的 Flask 的装饰器用法#
我们刚刚说了如何用 @lru_cache
来做缓存进行函数调用的场景,接下来我们扩展一下,展示装饰器在 Web 后端开发框架 Flask 中的典型用法。
在 Flask 里,装饰器被广泛用于定义“路由”,也就是 URL 与处理函数之间的绑定。
示例:定义一个简单的网页接口
from flask import Flask
app = Flask(__name__)
@app.route('/')def home(): return 'Hello, Flask!'
这是怎么回事?
-
@app.route('/')
是一个装饰器,它告诉 Flask:“当用户访问网站的根路径
/
时,就调用home()
这个函数,把返回的内容显示在页面上。”
这和 @lru_cache
本质上一样 —— 用一个装饰器函数来包装你的原始函数,附加新的功能(这里是 URL 路由绑定)。
再看一个带参数的例子:
@app.route('/hello/<name>')def greet(name): return f'Hello, {name}!'
访问 http://localhost:5000/hello/Alice
时,返回:
Hello, Alice!
Flask 装饰器 vs @lru_cache:对比总结
特性 | @lru_cache | @app.route() |
---|---|---|
来源 | functools 标准库 | Flask Web 框架 |
功能 | 缓存函数结果 | 绑定 URL 到函数 |
装饰器目的 | 提升性能 | 建立 Web 接口 |
是否包装原函数 | 是(加缓存逻辑) | 是(注册为 HTTP 处理函数) |
用于何种函数 | 计算型函数、递归函数 | 请求处理函数(返回 HTML/JSON 等) |
小结,装饰器在不同领域有不同用法:
- 在算法中(如
@lru_cache
):做性能优化 - 在 Web 开发中(如
@app.route
):做接口注册 - 在测试中(如
@pytest.mark.parametrize
):做参数组合 - 在类设计中(如
@property
):做接口转换
掌握装饰器 = 打通 Python 中各种高级语法的任督二脉!
实践:斐波那契数列对比实验#
我们以斐波那契函数为例,演示缓存的效果。
不使用缓存的情况:
def fib(n): if n < 2: return n return fib(n-1) + fib(n-2)
使用 @lru_cache
:
from functools import lru_cache
@lru_cache(maxsize=None)def fib(n): if n < 2: return n return fib(n-1) + fib(n-2)
在命令行中运行对比#
将上面的代码保存为两个文件,例如:
fib_no_cache.py
fib_with_cache.py
分别包含不带缓存和带缓存的版本。
然后在终端中使用 time
命令运行:
time python fib_no_cache.pytime python fib_with_cache.py
建议测试 n=35
或更大的数字,你会明显看到耗时差异。
示例结果对比
以 n=35
为例:
-
未使用缓存:
real 0m12.345suser 0m12.300ssys 0m0.010s -
使用 @lru_cache:
real 0m0.005suser 0m0.004ssys 0m0.000s
差距惊人。这说明对于递归调用和重复输入的函数,缓存能显著提升性能。
总结#
- 装饰器是 Python 的一个强大功能,可以让你轻松扩展函数的行为。
@lru_cache
是处理函数重复计算的一大利器,尤其适合递归算法。- CLI 工具如
time
可帮你直观评估代码性能。
下一篇我们将继续探索如何构建自己的 CLI 工具,并添加命令参数来控制行为,敬请期待!