【Python】【面试凉经】Fastapi为什么Fast
核心的关键词:ASGI、原生异步、协程、uvloop、异步生态、Pydantic编译时生成校验代码、DI system预计算依赖树
@interviewer 00:32:49 FastAPI 它优越于其他一些主流web框架像 django或 flask 的这个点在哪里?
@我 00:33:00fastapi 就是说它的 fast 性能高在哪里?它就是采用了一个携程来提高它的速度,通过事件循环…
FastAPI 的性能优势主要来自三个核心设计:
- 原生异步支持(Native async)-> 基于ASGI标准(Asynchronous Server Gateway Interface),通过协程避免了线程切换开销
- 自动请求验证(Auto-validation)-> 使用 Pydantic 在编译时生成校验代码,比运行时解释快10倍+
- 依赖注入系统(DI system)-> 通过类型提示预计算依赖树,减少运行时反射成本
FastAPI 之所以在并发性能上显著优于 Flask,并不仅仅是简单地使用了 uvloop
或异步特性,而是从设计理念、架构到底层实现都围绕异步和高并发进行了深度优化。以下是关键差异点:
1. 原生异步支持 vs. 兼容性适配
- FastAPI 从底层就是基于 ASGI (Asynchronous Server Gateway Interface) 设计的,原生支持
async/await
,每个请求都可以在事件循环中非阻塞地处理。例如:@app.get("/") async def read_data():data = await db.query() # 非阻塞IOreturn data
- Flask 是 WSGI 框架,本质是同步的。即使通过
asyncio
或gevent
实现异步,也是在同步基础上打补丁(如flask-async
或gevent
的 monkey-patch),存在上下文切换开销。
2. 性能关键组件的深度优化
- FastAPI 默认集成
uvicorn
(基于uvloop
和httptools
):uvloop
替换了 Python 原生事件循环,性能接近 Go 的 goroutine。httptools
是 C 实现的 HTTP 解析器,比 Python 原生解析快数倍。
- Flask 即使搭配
uvloop
,仍需通过asgiref
等适配层转换为 ASGI,额外开销不可避免。
3. 依赖注入与高效数据处理
- FastAPI 的依赖注入系统原生支持异步,且自动处理 JSON 解析(基于
orjson
或pydantic
):@app.post("/items") async def create_item(item: Item): # 自动异步解析和验证return item
- Flask 的请求解析和响应序列化是同步的,即使使用异步扩展,也需要手动处理。
4. 并发模型与生态工具链
- FastAPI 的整个生态链(如数据库驱动
asyncpg
、HTTP 客户端httpx
)是为异步设计的,避免阻塞事件循环。 - Flask 的生态大多为同步(如
SQLAlchemy
同步版、requests
),异步需要额外适配(如SQLAlchemy 2.0
的异步支持)。
总结:FastAPI 的优化矩阵
优化维度 | FastAPI | Flask |
---|---|---|
协议 | ASGI(原生异步) | WSGI(同步) |
事件循环 | uvloop + httptools(C层优化) | 原生或兼容层(性能损耗) |
依赖注入 | 原生异步支持 | 无或扩展实现 |
生态工具 | 全异步生态(如 asyncpg) | 同步为主 |
JSON 处理 | orjson/pydantic(Rust/C加速) | Python 原生 |
FastAPI 的高并发并非单一技术的结果,而是从协议、核心组件到生态的全栈异步设计。如果 Flask 想要达到同等性能,需要重写核心逻辑并迁移生态,这实际上就是重新实现了一个 FastAPI。
关于作者
- CSDN 大三小白新手菜鸟咸鱼本科生长期更新强烈建议不要关注!
作者的其他文章
Python
- 【Python】一直搞不懂迭代器是个啥。。-CSDN博客
- 【Python】包了一个闭包,Python解释器偷偷干了什么-CSDN博客
- 【Python|面试】import用了无数次,但你不知道它的一切……-CSDN博客