[2023] PyO3 로 파이썬 100배 빠르게 만들기
(ohadravid.github.io)최근 free-threading Python 공부하면서 PyO3 에 관심이 생겨서 2년된 글이지만 올려봅니다.
Making Python 100× Faster with <100 Lines of Rust – 요약
배경
- 사내 3-D 처리 파이프라인의 핵심 Python 라이브러리가 동시 사용자 증가로 병목을 일으킴.
- 전체를 Rust로 재작성하기엔 위험과 시간이 크므로 부분 최적화를 선택.
접근 방법
-
측정부터:
py-spy
샘플링 프로파일러로 병목 식별. -
점진적 Rust 도입
-
PyO3
+maturin
으로 Python ↔ Rust 연결. - 먼저
find_close_polygons
함수만 Rust로 이식. - 이어서
Polygon
자료구조까지 Rust로 옮겨 Python에서 서브클래싱.
-
-
반복 프로파일링-개선
- 불필요한 NumPy → Rust 변환 최소화.
- 할당·복사 줄이고 직접 거리 계산으로 미세 최적화.
성능 변화
단계 | 평균 실행 시간 (ms) | 개선 배수 |
---|---|---|
초기 순수 Python | 293.41 | 1× |
v1 – 함수만 Rust (--release ) |
23.44 | 12.5× |
v2 – Polygon 도 Rust |
6.29 | 46.5× |
v3 – 할당 제거·직접 계산 | 2.90 | 101× |
핵심 기술
- PyO3 : 안전한 Python ↔ Rust FFI.
- maturin : 빌드·배포 자동화.
- ndarray / numpy crate : Rust-측 배열·선형대수.
- py-spy : 네이티브 스택까지 보이는 프로파일러.
교훈
- 먼저 프로파일링하면 작은 코드 변경으로 큰 이득을 얻을 수 있다.
- Python API를 유지한 채 Rust 모듈만 교체해도 실사용 서비스에 즉시 적용 가능.
- Rust는 “성능 영역”을 얇게 도입해도 충분히 효과적이다.