🕐

FastAPI と Litestar の Hello World API ベンチマーク

2023/06/12に公開

Litestar という Python の ASGI フレームワークが、FastAPI や Starlette と同等
もしくは、それ以上に高速らしいってことで気になって軽く調べてみました。

Litestar

前提条件

  • MacBook Air M2 2022(MEM 16GB)
  • macOS 13.4
  • Python 3.9.14
  • uvicorn で起動されたローカル環境を対象に、h2load でベンチマークを実行
  • 対象の API は、Hello World

いずれも公式ドキュメントに例示されたサンプルコードを利用

FastAPI のサンプル

server.py
from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def read_root():
    return {"Hello": "World"}

FastAPI 公式ドキュメントに例示されたサンプルコードの一部を利用しています。

Litestar のサンプル

server.py
from starlite import Starlite, get


@get("/")
def hello_world() -> dict[str, str]:
    return {"hello": "world"}


app = Starlite(route_handlers=[hello_world])

Litestar 公式ドキュメントに例示されたサンプルコードの一部を利用しています。

ローカル環境でサーバーを起動する

Starlite を 8000 番ポートで、FastAPI を 8001 番ポートで起動します。

$ uvicorn server:app --reload --port 8000
$ uvicorn server:app --reload --port 8001

ベンチマーク

今回のベンチマークでは、リクエスト総数 100,000 をシーケンシャル(並列化なし)に処理するシナリオと、100 並列(クライアント数 100)に処理するシナリオで検証します。h2load の詳細については、下記のドキュメントを参照

まずは、FastAPI から

FastAPI (並列化なし) リクエスト総数 100,000

$ for x in (seq 10)
    h2load --h1 -n100000 http://localhost:8001 | grep 'finished in'
end
finished in 51.29s, 1949.89 req/s, 270.39KB/s
finished in 50.87s, 1965.81 req/s, 272.60KB/s
finished in 49.53s, 2019.08 req/s, 279.99KB/s
finished in 49.66s, 2013.79 req/s, 279.26KB/s
finished in 49.74s, 2010.52 req/s, 278.80KB/s
finished in 48.88s, 2045.64 req/s, 283.67KB/s
finished in 49.57s, 2017.28 req/s, 279.74KB/s
finished in 51.81s, 1930.04 req/s, 267.64KB/s
finished in 49.84s, 2006.42 req/s, 278.23KB/s
finished in 49.01s, 2040.26 req/s, 282.93KB/s

10 回平均の処理時間 50.02 秒
秒間リクエスト数 1999.873

FastAPI (100 並列) リクエスト総数 100,000

$ for x in (seq 10)
    h2load --h1 -n100000 -c100 http://localhost:8001 | grep 'finished in'
end
finished in 28.63s, 3492.41 req/s, 484.30KB/s
finished in 32.19s, 3106.40 req/s, 430.77KB/s
finished in 33.16s, 3016.07 req/s, 418.24KB/s
finished in 32.97s, 3033.42 req/s, 420.65KB/s
finished in 32.32s, 3093.60 req/s, 429.00KB/s
finished in 32.75s, 3053.14 req/s, 423.38KB/s
finished in 34.06s, 2936.42 req/s, 407.20KB/s
finished in 33.91s, 2948.60 req/s, 408.89KB/s
finished in 31.55s, 3169.29 req/s, 439.49KB/s
finished in 32.13s, 3112.64 req/s, 431.63KB/s

10 回平均の処理時間 32.367 秒
秒間リクエスト数 3096.199

次に Starlite

Starlite (並列化なし) リクエスト総数 100,000

$ for x in (seq 10)
    h2load --h1 -n100000 http://localhost:8000 | grep 'finished in'
end
finished in 31.89s, 3136.09 req/s, 434.89KB/s
finished in 30.63s, 3264.70 req/s, 452.72KB/s
finished in 30.77s, 3250.44 req/s, 450.74KB/s
finished in 30.45s, 3284.52 req/s, 455.47KB/s
finished in 30.45s, 3284.56 req/s, 455.48KB/s
finished in 30.06s, 3326.51 req/s, 461.29KB/s
finished in 30.20s, 3310.92 req/s, 459.13KB/s
finished in 29.93s, 3341.63 req/s, 463.39KB/s
finished in 30.81s, 3245.74 req/s, 450.09KB/s
finished in 30.63s, 3264.30 req/s, 452.67KB/s

10 回平均の処理時間 30.582 秒
秒間リクエスト数 3270.941

Starlite (100 並列) リクエスト総数 100,000

$ for x in (seq 10)
    h2load --h1 -n100000 -c100 http://localhost:8000 | grep 'finished in'
end
finished in 24.29s, 4117.16 req/s, 570.93KB/s
finished in 22.86s, 4373.53 req/s, 606.49KB/s
finished in 22.50s, 4445.17 req/s, 616.42KB/s
finished in 22.35s, 4474.03 req/s, 620.42KB/s
finished in 22.42s, 4460.72 req/s, 618.58KB/s
finished in 23.17s, 4316.67 req/s, 598.60KB/s
finished in 23.02s, 4343.54 req/s, 602.33KB/s
finished in 23.41s, 4271.08 req/s, 592.28KB/s
finished in 25.10s, 3984.42 req/s, 552.53KB/s
finished in 25.97s, 3850.01 req/s, 533.89KB/s

10 回平均の処理時間 23.509 秒
秒間リクエスト数 4263.633

結果

シーケンシャル:単純比較で 60%程度 Starlite が高速
100 並列:単純比較で 30%程度 Starlite が高速

性能面に関しては総じて、Starlite 優勢でした。他のフレームワークと比較しても、いろいろな機能がサポートされているみたいなのでもう少し、Litestar を試していこうと思います。

なお、公式ドキュメントには、より詳細なシナリオ別の比較データが公開されており
ASGI API フレームワークのベンチマークテスト用に専用のリポジトリも用意されています。
興味があればどうぞ。

GitHubで編集を提案

Discussion