Skip to content

Python 缓存与 CLI 工具入门(三):`@app.route('/')` 实践

· 4 min

同理,让我们看看 Web 后端开发框架的 Flask 的装饰器用法#

我们刚刚说了如何用 @lru_cache 来做缓存进行函数调用的场景,接下来我们扩展一下,展示装饰器在 Web 后端开发框架 Flask 中的典型用法。

在 Flask 里,装饰器被广泛用于定义“路由”,也就是 URL 与处理函数之间的绑定。

示例:定义一个简单的网页接口

from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return 'Hello, Flask!'

这是怎么回事?

这和 @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 等)

小结,装饰器在不同领域有不同用法:

掌握装饰器 = 打通 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)

在命令行中运行对比#

将上面的代码保存为两个文件,例如:

分别包含不带缓存和带缓存的版本。

然后在终端中使用 time 命令运行:

Terminal window
time python fib_no_cache.py
time python fib_with_cache.py

建议测试 n=35 或更大的数字,你会明显看到耗时差异。

示例结果对比

n=35 为例:

差距惊人。这说明对于递归调用和重复输入的函数,缓存能显著提升性能。


总结#

下一篇我们将继续探索如何构建自己的 CLI 工具,并添加命令参数来控制行为,敬请期待!