基准测试¶
独立的 TechEmpower 基准测试显示,在 Uvicorn 下运行的 FastAPI 应用程序是目前最快的 Python 框架之一,仅次于 Starlette 和 Uvicorn 本身(FastAPI 在内部使用了这两个库)。
但在查看基准测试和对比时,你应该牢记以下几点。
基准测试与速度¶
当你查看基准测试时,经常会看到将不同类型的工具视为等价进行比较的情况。
特别是将 Uvicorn、Starlette 和 FastAPI 放在一起比较(以及许多其他工具)。
工具解决的问题越简单,其性能表现通常越好。而大多数基准测试并没有测试该工具所提供的附加功能。
层级关系如下:
-
Uvicorn:一个 ASGI 服务器
- Starlette:(使用 Uvicorn)一个 Web 微框架
- FastAPI:(使用 Starlette)一个 API 微框架,为构建 API 提供了多种附加功能,如数据验证等。
- Starlette:(使用 Uvicorn)一个 Web 微框架
-
Uvicorn:
- 性能最好,因为它除了服务器本身外,没有太多额外的代码。
- 你不会直接使用 Uvicorn 来编写应用程序。这意味着你的代码至少需要包含 Starlette(或 FastAPI)所提供的所有代码。如果你那样做了,最终应用程序的开销将与使用框架相同,同时还要承担自己编写代码可能带来的错误。
- 如果你在比较 Uvicorn,请将其与 Daphne、Hypercorn、uWSGI 等应用服务器进行比较。
- Starlette:
- 性能仅次于 Uvicorn。事实上,Starlette 使用 Uvicorn 来运行。因此,它之所以比 Uvicorn “慢”,仅仅是因为它需要执行更多的代码。
- 但它为你提供了构建简单 Web 应用程序的工具,例如基于路径的路由等。
- 如果你在比较 Starlette,请将其与 Sanic、Flask、Django 等 Web 框架(或微框架)进行比较。
- FastAPI:
- 正如 Starlette 使用 Uvicorn 且不可能比它快一样,FastAPI 使用 Starlette,因此它也不可能比 Starlette 快。
- FastAPI 在 Starlette 之上提供了更多功能。这些功能是你构建 API 时几乎总是需要的,例如数据验证和序列化。通过使用它,你可以免费获得自动生成的文档(自动文档甚至不会增加运行应用程序的开销,因为它是在启动时生成的)。
- 如果你不使用 FastAPI,而是直接使用 Starlette(或其它工具,如 Sanic、Flask、Responder 等),你将不得不自己实现所有的数据验证和序列化。因此,你的最终应用程序的开销与使用 FastAPI 构建的应用程序是一样的。在许多情况下,数据验证和序列化是应用程序中代码量最大的部分。
- 所以,通过使用 FastAPI,你节省了开发时间、避免了 Bug、减少了代码行数,而且你可能会获得与不使用它时相同(甚至更好)的性能(因为如果你不使用它,你仍然必须在自己的代码中实现所有这些功能)。
- 如果你在比较 FastAPI,请将其与提供数据验证、序列化和文档的 Web 应用程序框架(或工具集)进行比较,例如 Flask-apispec、NestJS、Molten 等集成自动数据验证、序列化和文档的框架。