Pydantic v2의 심장, Rust로 Python 라이브러리 만드는 법

Libraries Run Rust Inside Python (With PyO3)

Pydantic v2의 심장, Rust로 Python 라이브러리 만드는 법

Pydantic v2의 핵심인 pydantic-core는 PyO3로 Rust 확장을 구현해 데이터 검증을 수행한다. 이 글은 Rust로 JSON 파서를 작성하고 PyO3 매크로를 붙여 maturin으로 빌드한 뒤 Python에서 임포트하는 4단계를 설명한다. 특히 Rust의 JsonValue 트리를 Python 객체로 변환하는 과정이 파싱 자체보다 더 큰 비용을 초래할 수 있음을 지적하며, 경계 비용을 프로파일링하고 지연 평가 뷰를 고려하라고 조언한다.

10만 개 값이 있는 문서라면 파싱이 완전히 끝난 뒤 경계에서 약 10만 개의 Python 객체가 생성된다. 대형 문서에서는 이 구체화 루프가 파싱이 아니라 전체 시간을 지배할 수 있다.
  1. simonw

    이런 흐름이 시작될 때는 좀 불안했어요. 저는 Pyodide(Python을 WebAssembly로 돌리는 것)에 관심이 많고, PyO3를 사용하는 라이브러리들은 Pyodide에서 작동하지 않을 수 있기 때문이죠.

    다행히 이제 대부분 해결됐습니다. 이제 PyPI에 Rust나 C 확장의 WASM 빌드를 컴파일해서 게시할 수 있고, Pyodide가 그것을 사용할 수 있습니다.

    예를 들어 Rust가 포함된 Pydantic-core 패키지의 WASM 빌드가 여기 있습니다: https://pypi.org/project/pydantic_core/#pydantic_core-2.49.0...

  2. the__alchemist

    이건 멋진 재주네요! 저는 Rust로 작성되었지만 주로 Python 사용자들이 쓰는 소프트웨어(예: 생물학 도구)를 쉽게 설치할 수 있도록 이걸 사용합니다. 어떤 사람들은 실행 파일이나 설치 프로그램을 다운로드하는 것보다 `pip install <name>`을 선호하니까요. 보너스: Maturin/PyO3가 자동으로 "manylinux" 바이너리를 빌드해줘서 Linux ABI 분열 문제를 완화하는 데 도움이 됩니다.

  3. skeledrew

    그런데 이게 Python이 작동하는 모든 곳에서 작동하나요? 이 Rust 전환에 대해 제가 항상 가진 주요 문제는 호환성이었습니다. Python은 정말 수많은 곳에 임베드되어 실행될 수 있습니다. 제가 의존하고 싶은 라이브러리가 실제로 Rust로 구현되어 있는데, 제 타겟이 툴체인을 처리하지 못하거나 처리할 수 없고 빌드 타겟도 없다면 어떻게 되는 건가요?

  4. roywiggins

    > 손을 뻗으면, Rust 확장이 일을 해준다

    ai; dr, 죄송합니다

  5. startup_zombie_

    패키지 작성자들이 WASM을 위해 특별히 아무것도 하지 않고도 현존하는 PyPI 생태계 중 얼마나 많은 부분이 현실적으로 이런 방식으로 작동할 수 있다고 생각하시나요?

이 날의 다른 글

2026-09-13