새소식

반응형
Python/성능

FastAPI 성능 최적화하기

  • -
반응형

FastAPI 애플리케이션의 성능을 개선하기 위해 많은 자료를 찾아보고 정리해봅니다.

fastapi image generated by AI

예제 소개

다음은 FastAPI의 기본적인 엔드포인트 예제입니다. Product라는 Pydantic 모델을 정의하고, products 리스트를 반환하는 엔드포인트를 구현했습니다. 각 섹션에서 이 코드를 조금씩 최적화하며 개선해 보겠습니다.

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class Product(BaseModel):
    product_id: str
    price: float

@app.get("/products/", response_model=list[Product])
def read_products():
    products = [Product(product_id="Foo", price=42.0), Product(product_id="Bar", price=36.0)]
    return [product.dict() for product in products]

최적화 시작!

1. 비동기 엔드포인트 사용

엔드포인트를 async def로 정의하면 FastAPI가 요청을 비동기로 처리할 수 있습니다. 특히 I/O 작업이 많은 경우 성능이 크게 향상됩니다.

@app.get("/products/", response_model=list[Product])
async def read_products():
    products = [Product(product_id="Foo", price=42.0), Product(product_id="Bar", price=36.0)]
    return [product.dict() for product in products]

2. 중복된 데이터 검증 방지

FastAPI는 응답 데이터를 response_model로 자동 검증합니다. 따라서 Pydantic 모델을 별도로 생성한 뒤 다시 검증하면 불필요한 작업이 발생합니다. 딕셔너리를 직접 반환하면 검증 단계를 줄여 성능을 개선할 수 있습니다.

@app.get("/products/", response_model=list[Product])
async def read_products():
    return [{"product_id": "Foo", "price": 42.0}, {"product_id": "Bar", "price": 36.0}]

반응형

3. 빠른 직렬화를 위한 orjson 사용

JSON 직렬화 성능을 개선하려면 Rust로 작성된 빠른 JSON 라이브러리인 orjson을 사용하는 것이 좋습니다.

설치:

pip install orjson

기본 응답 클래스로 설정:

from fastapi.responses import ORJSONResponse

app = FastAPI(default_response_class=ORJSONResponse)

4. 응답 검증 생략 (주의 필요)

응답 데이터가 유효하다는 확신이 있다면 response_model을 사용하지 않고 Pydantic 모델을 직접 반환하여 검증 과정을 생략할 수 있습니다. 다만, 이 경우 중요한 안전성 검사를 포기하게 되므로 주의가 필요합니다.

@app.get("/products/")
async def read_products():
    products = [Product(product_id="Foo", price=42.0), Product(product_id="Bar", price=36.0)]
    return products

5. uvloop 사용

I/O 작업을 더 효율적으로 처리하려면 uvloop을 설치하세요. uvloop이 설치되어 있으면 Uvicorn이 자동으로 이를 사용합니다.

설치:

pip install uvloop

6. 접근 로그 비활성화 (주의 필요)

모든 요청을 로깅하면 성능에 영향을 줄 수 있습니다. 높은 부하에서 로깅이 불필요하다면 접근 로그를 비활성화하여 약 15%의 성능 향상을 기대할 수 있습니다.

실행:

uvicorn main:app --no-access-log

7. httptools 사용

httptools는 기본 HTTP 파서(H11)보다 빠릅니다. httptools를 설치하면 자동으로 성능이 개선됩니다.

설치:

pip install httptools

결론

FastAPI의 성능 최적화는 코드베이스를 크게 변경하지 않고도 가능합니다. uvloop, httptools와 같은 라이브러리를 활용하고, 엔드포인트 구현 방식을 개선하면 애플리케이션의 처리 속도를 눈에 띄게 향상시킬 수 있습니다.  🚀

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.