# [2023] PyO3 로 파이썬 100배 빠르게 만들기

> Clean Markdown view of GeekNews topic #21047. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=21047](https://news.hada.io/topic?id=21047)
- GeekNews Markdown: [https://news.hada.io/topic/21047.md](https://news.hada.io/topic/21047.md)
- Type: news
- Author: [darjeeling](https://news.hada.io/@darjeeling)
- Published: 2025-05-23T00:51:22+09:00
- Updated: 2025-05-23T00:51:22+09:00
- Original source: [ohadravid.github.io](https://ohadravid.github.io/posts/2023-03-rusty-python/)
- Points: 12
- Comments: 3

## Summary

사내 **3-D 처리 파이프라인**의 성능 병목을 해결하기 위해, 기존 Python 코드에서 **PyO3**와 **maturin**을 활용하여 핵심 연산만 Rust로 부분 최적화하였습니다. `py-spy`로 병목을 정확히 측정하고, **find_close_polygons** 함수와 **Polygon 자료구조**를 점진적으로 Rust로 이식하여 실행 속도를 100배 이상 개선하였습니다. 최적화 과정에서 **NumPy 변환 최소화**와 직접 메모리 관리로 추가적인 성능 이득을 가져왔습니다. Python API를 유지하면서도 Rust의 성능을 일부만 도입하는 전략이 실제 서비스에서 즉각 효과를 보였기 때문에, 병목 해소와 확장성에 관심 있는 스타트업 및 개발자에게 실용적인 인사이트를 제공합니다.

## Topic Body

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

## Comments



### Comment 39136

- Author: allinux
- Created: 2025-05-23T17:54:43+09:00
- Points: 1

c/c++ 로 파이썬 확장을 만드는 것은 생산성이 너무 떨어지는데 pyo3 는 일단 maturin, cargo 가 있어 너무 편합니다.   
또 파이썬 모듈은 크로스 컴파일도 필수인데 rust 는 크로스 컴파일도 편합니다.

### Comment 39112

- Author: lamanus
- Created: 2025-05-23T12:11:19+09:00
- Points: 1

maturin... 고통...

### Comment 39082

- Author: aer0700
- Created: 2025-05-23T06:59:25+09:00
- Points: 2

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