Перейти к содержанию

Замеры производительности

Независимые тесты производительности приложений от TechEmpower показывают, что FastAPI под управлением Uvicorn один из самых быстрых Python-фреймворков и уступает только Starlette и Uvicorn (которые используются в FastAPI). (*)

Но при просмотре и сравнении замеров производительности следует иметь в виду нижеописанное.

Замеры производительности и скорости

В подобных тестах часто можно увидеть, что инструменты разного типа сравнивают друг с другом, как аналогичные.

В частности, сравнивают вместе Uvicorn, Starlette и FastAPI (среди многих других инструментов).

Чем проще проблема, которую решает инструмент, тем выше его производительность. И большинство тестов не проверяют дополнительные функции, предоставляемые инструментом.

Иерархия инструментов имеет следующий вид:

  • Uvicorn: ASGI-сервер

    • Starlette (использует Uvicorn): веб-микрофреймворк
      • FastAPI (использует Starlette): API-микрофреймворк с дополнительными функциями для создания API, с валидацией данных и т.д.
  • Uvicorn:

    • Будет иметь наилучшую производительность, так как не имеет большого количества дополнительного кода, кроме самого сервера.
    • Вы не будете писать приложение на Uvicorn напрямую. Это означало бы, что Ваш код должен включать как минимум весь код, предоставляемый Starlette (или FastAPI). И если Вы так сделаете, то в конечном итоге Ваше приложение будет иметь те же накладные расходы, что и при использовании фреймворка, минимизирующего код Вашего приложения и Ваши ошибки.
    • Uvicorn подлежит сравнению с Daphne, Hypercorn, uWSGI и другими веб-серверами.
  • Starlette:

    • Будет уступать Uvicorn по производительности. Фактически Starlette управляется Uvicorn и из-за выполнения большего количества кода он не может быть быстрее, чем Uvicorn.
    • Зато он предоставляет Вам инструменты для создания простых веб-приложений с обработкой маршрутов URL и т.д.
    • Starlette следует сравнивать с Sanic, Flask, Django и другими веб-фреймворками (или микрофреймворками).
  • FastAPI:

    • Так же как Starlette использует Uvicorn и не может быть быстрее него, FastAPI использует Starlette, то есть он не может быть быстрее Starlette.
    • FastAPI предоставляет больше возможностей поверх Starlette, которые наверняка Вам понадобятся при создании API, такие как проверка данных и сериализация. В довесок Вы ещё и получаете автоматическую документацию (автоматическая документация даже не увеличивает накладные расходы при работе приложения, так как она создается при запуске).
    • Если Вы не используете FastAPI, а используете Starlette напрямую (или другой инструмент вроде Sanic, Flask, Responder и т.д.), Вам пришлось бы самостоятельно реализовать валидацию и сериализацию данных. То есть, в итоге, Ваше приложение имело бы такие же накладные расходы, как если бы оно было создано с использованием FastAPI. И во многих случаях валидация и сериализация данных представляют собой самый большой объём кода, написанного в приложениях.
    • Таким образом, используя FastAPI Вы потратите меньше времени на разработку, уменьшите количество ошибок, строк кода и, вероятно, получите ту же производительность (или лучше), как и если бы не использовали его (поскольку Вам пришлось бы реализовать все его возможности в своем коде).
    • FastAPI должно сравнивать с фреймворками веб-приложений (или наборами инструментов), которые обеспечивают валидацию и сериализацию данных, а также предоставляют автоматическую документацию, такими как Flask-apispec, NestJS, Molten и им подобные.