FastAPI と Litestar の Hello World API ベンチマーク
Litestar という Python の ASGI フレームワークが、FastAPI や Starlette と同等
もしくは、それ以上に高速らしいってことで気になって軽く調べてみました。
前提条件
- MacBook Air M2 2022(MEM 16GB)
- macOS 13.4
- Python 3.9.14
- uvicorn で起動されたローカル環境を対象に、h2load でベンチマークを実行
- 対象の API は、Hello World
いずれも公式ドキュメントに例示されたサンプルコードを利用
FastAPI のサンプル
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"Hello": "World"}
FastAPI 公式ドキュメントに例示されたサンプルコードの一部を利用しています。
Litestar のサンプル
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 フレームワークのベンチマークテスト用に専用のリポジトリも用意されています。
興味があればどうぞ。
Discussion