최근 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는 “성능 영역”을 얇게 도입해도 충분히 효과적이다.