2022年5月25日水曜日

pythonのFastAPIは、「高速: NodeJS や Go 並みのとても高いパフォーマンス」とありますが、なぜ速いのでしょうか?

https://jp.quora.com/python%E3%81%AEFastAPI%E3%81%AF-%E9%AB%98%E9%80%9F-NodeJS-%E3%82%84-Go-%E4%B8%A6%E3%81%BF%E3%81%AE%E3%81%A8%E3%81%A6%E3%82%82%E9%AB%98%E3%81%84%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9-

基本的にWebAPIはHTTP通信やDBとのやり取りなどのIOが主なボトルネックですので非同期処理に対応していることが重要です。FastAPIでは従来のPythonの標準的なWSGIではなく、非同期処理に対応したASGIに準拠している点がFlaskなどとの大きな違いです。内部でStartletteを利用し、ASGIの実行環境としてUvicornを使用するなどの点は他の回答の通りです。

もちろんちゃんとASGIの利点を生かすためにはasync defを使用して関数を定義し、IO処理ではasync/awaitをしっかり利用することが不可欠です。DBとの接続も非同期処理に対応したものを使用する必要があります[1] 。

しかし、それでもnodejsやGo並みというのはかなり盛っているといわざるを得ません。マイクロベンチマークでいくら速くても言語レベルで非同期前提のそれらの言語と比べると必ず様々なオーバーヘッドが出てきます。ただ、FlaskなどのWSGIの時代と比べるとはるかに進化しているということは確実です。

私が思うにFastAPIの一番の売りはPythonのType Hintを実際にデータのバリデーションに使用したり、OpenAPIドキュメントの自動生成に活用しているという点です。特に後者については同等の機能を有した他言語のフレームワークをいまだに見たことがなく、私はAPIサーバーを作る場合は第

… (もっと読む)

脚注

Yuki83748
さんから1件のコメント

気になったので調べてみました。

FastAPIを使ったことも無いしソースを読んだわけでもないので書いてあることが正しければという前提です。

  • 高速NodeJS や Go 並みのとても高いパフォーマンス (Starlette と Pydantic のおかげです)。
FastAPI
FastAPI FastAPI framework, high performance, easy to learn, fast to code, ready for production ドキュメント : https://fastapi.tiangolo.com ソースコード : https://github.com/tiangolo/fastapi FastAPI は、Pythonの標準である型ヒントに基づいてPython 3.6 以降でAPI を構築するための、モダンで、高速(高パフォーマンス)な、Web フレームワークです。 主な特徴: * 本番アプリケーションを構築している開発チームのテストによる見積もり。 Other sponsors " [...] 最近 FastAPI を使っています。 [...] 実際に私のチームの全ての Microsoft の機械学習サービス で使用する予定です。 そのうちのいくつかのコアな Windows 製品と Office 製品に統合されつつあります。 " Kabir Khan - Microsoft (ref) " FastAPIライブラリを採用し、クエリで 予測値 を取得できる REST サーバを構築しました。 [for Ludwig] " Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - Uber (ref) " Netflix は、 危機管理 オーケストレーションフレームワーク、 Dispatch のオープンソースリリースを発表できることをうれしく思います。 [built with FastAPI ] " Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref) " 私は FastAPI にワクワクしています。 めちゃくちゃ楽しいです! " " 正直、超堅実で洗練されているように見えます。いろんな意味で、それは私がハグしたかったものです。 " " REST API を構築するための モダンなフレームワーク を学びたい方は、 FastAPI [...] をチェックしてみてください。 [...] 高速で, 使用、習得が簡単です。[...] " " 私たちの API は FastAPI に切り替えました。[...] きっと気に入ると思います。 [...] " Typer , the FastAPI of CLIs ¶ もし Web API の代わりにターミナルで使用する CLI アプリを構築する場合は、 Typer を確認してください。 Typer は FastAPI の弟分です。そして、 CLI 版 の FastAPI を意味しています。 必要条件 ¶ Python 3.6+ FastAPI は巨人の肩の上に立っています。 インストール ¶ $ pip install fastapi ---> 100% 本番環境では、 Uvicorn または、 Hypercorn のような、 ASGI サーバーが必要になります。 $ pip install uvicorn [ standard ] ---> 100% アプリケーション例 ¶ アプリケーションの作成 ¶ main.py を作成し、以下のコードを入力します: from fastapi import FastAPI app = FastAPI () @app . get ( "/" ) def read_root (): return { "Hello" : "World" } @app . get ( "/items/ {item_id} " ) def read_item ( item_id : int , q : str = None ): return { "item_id" : item_id , "q" : q } または async def を使います... async / await を使用するときは、 async def を使います: from fastapi import FastAPI app = FastAPI () @app . get ( "/" ) async def read_root (): return { "Hello" : "World" } @app . get ( "/items/ {item_id} " ) async def read_item ( item_id : int , q : str = None ): return { "item_id" : item_id , "q" : q } 注 : わからない場合は、 ドキュメントの async と await にある "In a hurry?"セクションをチェックしてください。 以下のコマンドでサーバーを起動します: $ uvicorn main:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) INFO: Started reloader process [28720] INFO: Started server process [28722] INFO: Waiting for application startup. INFO: Application startup complete. uvicorn main:app --reload コマンドについて uvicorn main:app コマンドは以下の項目を参照します: main : main.py ファイル (Python "モジュール") app : main.py の app = FastAPI() の行で生成されたオブジェクト --reload : コードを変更したらサーバーを再起動します。このオプションは開発環境でのみ使用します 動作確認 ¶ ブラウザから http://127.0.0.1:8000/items/5?q=somequery を開きます。 以下の JSON のレスポンスが確認できます: { "item_id" : 5 , "q" : "somequery" } もうすでに以下の API が作成されています: / と /items/{item_id} のパスで HTTP リクエストを受けます。 どちらのパスも GET 操作 を取ります。(HTTP メソッドとしても知られています。) /items/{item_id} パスのパスパラメータ item_id は int でなければなりません。 パス /items/{item_id} はオプションの str クエリパラメータ q を持ちます。 自動対話型の API ドキュメント ¶ http://127.0.0.1:8000/docs にアクセスしてみてください。 自動対話型の API ドキュメントが表示されます。 ( Swagger UI が提供しています。): 代替の API ドキュメント

Starlette と Pydanticというライブラリが肝のようですね。

そして、

  • ASGI serverにUvicornやHypercornを使っているため
    • それらはuvloopという非同期処理実行ライブラリを使用しているため
      • uvloopがCythonで実装されているため
  • Starlette が効率的に非同期処理を実行するため
  • Benchmarks - pydantic なぜ速いかは分からなかったが公式は速いと言っている
FastAPIでStarletteとPydanticはどのように使われているか - Qiita
FastAPIは: 主な特徴: 高速: NodeJS や Go 並みのとても高いパフォーマンス (Starlette と Pydantic のおかげです)。 最も高速な Python フレームワークの一つです. .... ...

あたりが速い理由のようです。

ASGI serverについてはpythonの他フレームワークでも使えるようなので、そこまでの優位性にはならなさそうですが、速いものを一纏めにして「FastAPI」として提供しているところに強みがありそうですね。

0 コメント:

コメントを投稿