7P by darjeeling 14시간전 | ★ favorite | 댓글 2개

최근 free-threading Python 공부하면서 PyO3 에 관심이 생겨서 2년된 글이지만 올려봅니다.

Making Python 100× Faster with <100 Lines of Rust – 요약

배경

  • 사내 3-D 처리 파이프라인의 핵심 Python 라이브러리가 동시 사용자 증가로 병목을 일으킴.
  • 전체를 Rust로 재작성하기엔 위험과 시간이 크므로 부분 최적화를 선택.

접근 방법

  1. 측정부터: py-spy 샘플링 프로파일러로 병목 식별.
  2. 점진적 Rust 도입
    • PyO3 + maturin으로 Python ↔ Rust 연결.
    • 먼저 find_close_polygons 함수만 Rust로 이식.
    • 이어서 Polygon 자료구조까지 Rust로 옮겨 Python에서 서브클래싱.
  3. 반복 프로파일링-개선
    • 불필요한 NumPy → Rust 변환 최소화.
    • 할당·복사 줄이고 직접 거리 계산으로 미세 최적화.

성능 변화

단계 평균 실행 시간 (ms) 개선 배수
초기 순수 Python 293.41
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는 “성능 영역”을 얇게 도입해도 충분히 효과적이다.

maturin... 고통...

최대한 넘파이 벡터화로 버티고, 안되면 GPU 꽂고 cupy나 torch로 바꾸고, 그래도 안되면 cython으로 네이티브 짜거나 하는데... 네이티브는 왠만하면 안하는 게 좋은듯합니다. 힘들어요.