首頁  >  文章  >  後端開發  >  如何優化FastAPI中的JSON資料檢索速度?

如何優化FastAPI中的JSON資料檢索速度?

DDD
DDD原創
2024-10-18 22:58:30454瀏覽

How to Optimize JSON Data Retrieval Speed in FastAPI?

優化FastAPI 中的JSON 資料檢索速度

從FastAPI 的GET 端點返回相當大的JSON 負載的速度緩慢是一個反覆出現的問題。當使用 json.dumps() 透過 json.loads() 從檔案傳輸資料時,回應會大幅延遲。雖然返回數據可用於向用戶發送數據,但有沒有更有效的方法?

問題:
處理管道最初使用pandas 的to_json 將資料轉換為JSON () 函數,然後使用json.loads() 將其載入到字典中,最後將其轉換回JSON。這種多步驟轉換過程會帶來相當大的延遲。

建議的解決方案:

首先,認識到FastAPI 使用以下方法將回傳值轉換為JSON 相容的資料至關重要: jsonable_encoder,然後使用標準Python的json.dumps() 函數進行序列化。眾所周知,這個兩步驟過程很慢。

選項 1:利用替代 JSON 編碼器
考慮使用替代 JSON 編碼器,例如 orjson 或 ujson。這些編碼器的效能優於預設的 jsonable_encoder 和 json.dumps() 組合。

選項 2:直接傳回自訂回應
為了獲得最佳效能,請使用自訂 APIRoute 類別並傳回回應目的。這會繞過 FastAPI 的預設 JSON 轉換過程。

<code class="python">from fastapi.routing import APIRouter, APIRoute

class TimedRoute(APIRoute):
    ...

app = FastAPI()
router = APIRouter(route_class=TimedRoute)

@router.get("/custom-response")
def get_data():
    df = pd.read_parquet('data.parquet')
    return Response(df.to_json(orient="records"), media_type="application/json")

app.include_router(router)</code>

其他注意事項:

  • 流式回應:如果處理,請考慮使用流動式回應異常大的資料集可能會導致記憶體不足問題。
  • Dask 函式庫: 利用 Dask 高效處理大量資料。在使用 .to_json() 之前將產生的 Dask DataFrame 轉換為 Pandas DataFrame。
  • 檔案下載: 設定 Content-Disposition 標頭以指示應將回應下載為文件,繞過瀏覽器渲染延遲。

以上是如何優化FastAPI中的JSON資料檢索速度?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn