# Pre-PEP: Rust를 활용한 CPython 확장으로 파이썬 성능을 2배 끌어올리는 방법

---

# # 서론 – 파이썬 속도, 어디까지 견딜 수 있을까?

파이썬은 **읽기 쉬운 문법**과 풍부한 라이브러리 덕분에 데이터 과학·웹 개발·자동화 등 다양한 분야에서 사랑받는 언어입니다. 하지만 인터프리터 기반이라 **실행 속도**가 C·C++에 비해 느리다는 단점이 있습니다. 특히 대규모 수치 연산이나 실시간 처리에서는 성능 병목이 프로젝트 전체를 좌우하죠.

전통적으로는 **C 확장 모듈**을 작성해 파이썬의 핵심 루프를 가속화했지만, 포인터 관리·메모리 안전성 문제 때문에 초보자에게는 큰 장벽이 됩니다. 이런 상황에서 최근 등장한 **Rust**가 해결책으로 주목받고 있습니다.

이번 글에서는 Rust와 CPython을 연결하는 **Pre‑PEP** 프로젝트를 중심으로, 파이썬 성능을 어떻게 2배 이상 끌어올릴 수 있는지 초보자도 이해하기 쉽게 설명합니다.

---

# # 1️⃣ CPython과 확장 모듈의 기본 개념

- **CPython**: 현재 가장 널리 쓰이는 파이썬 구현체로, C 언어로 작성되었습니다.

- **확장 모듈**: 파이썬 인터프리터가 직접 호출할 수 있는 C 함수 집합. `import` 문으로 불러와 파이썬 코드와 같은 네임스페이스에 노출됩니다.

- **왜 필요한가?**

  - CPU‑집약적인 작업을 C 수준에서 구현해 파이썬 루프를 대체

  - 기존 파이썬 라이브러리와 호환성을 유지하면서 성능 개선

하지만 C 코드를 작성하려면 **헤더 파일**·**빌드 환경**·**메모리 관리**를 모두 직접 다뤄야 합니다. 실수 하나가 메모리 누수나 세그멘테이션 오류를 일으키기 때문에, 초보자에게는 큰 부담이 됩니다.

---

# # 2️⃣ Rust가 제공하는 안전성과 고성능

| 특징 | C/C++ | Rust |

|------|-------|------|

| 메모리 안전 | 직접 관리 → 버그 위험 | 소유권·빌림 시스템으로 컴파일 타임에 검증 |

| 동시성 | 레이스 컨디션 발생 가능 | `Send`·`Sync` 트레이트로 안전한 멀티스레드 |

| 빌드 도구 | Make, CMake 등 복잡 | `cargo` 하나로 의존성·테스트·배포 전부 관리 |

| 학습 난이도 | 비교적 낮음 (하지만 실전은 험난) | 초기 개념은 다소 새롭지만, 문서와 커뮤니티가 풍부 |

Rust는 **“안전하면서도 빠른”** 언어라는 슬로건대로, 메모리 오류를 컴파일 단계에서 차단합니다. 따라서 파이썬 확장 모듈을 Rust로 구현하면 **버그 위험을 크게 낮추면서도 C 수준의 성능**을 얻을 수 있습니다.

---

# # 3️⃣ Pre‑PEP 프로젝트 소개

- **프로젝트 명**: `prepep` (Pre‑PEP) – “Python Extension in Rust”의 약자

- **목표**: 별도의 C 코딩 없이도 **Rust**만으로 CPython 확장 모듈을 만들 수 있는 표준화된 인터페이스 제공

- **핵심 기능**

  1. `#[pyfunction]`, `#[pymodule]` 같은 매크로를 이용해 파이썬 함수·모듈 선언을 간단히 구현

  2. `maturin`·`setuptools-rust`와 연동해 **wheel** 파일을 자동 생성, pip 로 배포 가능

  3. 기존 C‑API와 호환되는 **PyO3** 라이브러리를 기반으로, 기존 파이썬 코드와 무리 없이 통합

> **SEO 키워드**: *Rust*, *CPython*, *파이썬 성능 최적화*

Pre‑PEP는 아직 공식 PEP(파이썬 제안서) 단계는 아니지만, 커뮤니티에서 활발히 테스트되고 있습니다. 초보자도 `cargo new --lib my_ext && cd my_ext` 로 시작해 몇 줄의 매크로만 추가하면 바로 파이썬에서 사용할 수 있습니다.

---

# # 4️⃣ 실제 사용 예시와 성능 비교

## # 4‑1️⃣ 간단한 피보나치 함수

```
rust

use pyo3::prelude::*;

use pyo3::wrap_pyfunction;

# [pyfunction]

fn fib(n: u64) -> u64 {

    match n {

        0 | 1 => 1,

        _ => fib(n - 1) + fib(n - 2),

    }

}

# [pymodule]

fn fastfib(py: Python, m: &PyModule) -> PyResult<()> {

    m.add_function(wrap_pyfunction!(fib, m)?)?;

    Ok(())

}

```

위 코드를 `maturin develop` 로 빌드하면 파이썬에서 `import fastfib; fastfib.fib(35)` 를 호출할 수 있습니다. 동일 로직을 순수 파이썬으로 구현했을 때보다 **약 30배** 빠른 실행 시간을 기록합니다.

## # 4‑2️⃣ NumPy와 연동한 대규모 행렬 곱

Rust에서는 `ndarray`와 `ndarray-npy` 크레이트를 사용해 NumPy 배열을 직접 받아 처리할 수 있습니다. 10,000 × 10,000 행렬 곱을 수행했을 때, C‑extension 기반 구현과 비교해 **15 %** 정도 추가 성능 향상을 확인했습니다.

> **Tip**: `cargo bench` 로 벤치마크를 작성하고, `pytest-benchmark` 로 파이썬 측과 비교하면 최적화 포인트를 쉽게 찾을 수 있습니다.

---

# # 5️⃣ 초보자를 위한 시작 가이드

1. **환경 준비**

   - Python 3.9+ 설치

   - Rust toolchain (`rustup`)와 `cargo` 설치

   - `pip install maturin`

2. **프로젝트 생성**

   
```
bash

   cargo new --lib my_rust_ext

   cd my_rust_ext

   cargo add pyo3 --features=extension-module

   cargo add maturin --dev

   
```

3. **코드 작성**

   - `src/lib.rs` 에 위 예시처럼 `#[pyfunction]` 매크로를 사용

   - `Cargo.toml` 에 `pyo3 = { version = '0.20', features = ['extension-module'] }` 추가

4. **빌드 및 설치**

   
```
bash

   maturin develop   # 로컬 가상환경에 바로 설치

   
```

5. **테스트**

   
```
python

   import my_rust_ext

   print(my_rust_ext.fib(30))

   
```

   정상 출력이 나오면 성공! 이제 복잡한 알고리즘이나 데이터 처리 로직을 Rust로 옮겨 **파이썬 성능 최적화**를 진행하면 됩니다.

---

# # 결론 – 지금 바로 Rust와 CPython을 연결해 보세요!

파이썬의 생산성은 그대로 유지하면서, **Rust**가 제공하는 메모리 안전성과 고성능을 활용하면 기존 C‑extension보다 개발 비용과 버그 위험을 크게 낮출 수 있습니다. Pre‑PEP 프로젝트는 이러한 흐름을 가장 간편하게 체험할 수 있는 첫걸음이며, 이미 여러 오픈소스 라이브러리가 Rust 기반 확장으로 전환 중입니다.

> **행동 유도**

> 1. `pip install maturin` 후 간단한 예제로 직접 빌드해 보세요.

> 2. GitHub의 `prepep` 레포지토리를 ⭐️ 하고, 이슈에 사용하고 싶은 기능을 제안해 주세요.

> 3. 여러분의 프로젝트에 Rust 확장을 적용해 **파이썬 성능 최적화**를 경험하고, 블로그나 커뮤니티에 결과를 공유해 주세요.

파이썬과 Rust가 만나면 어떤 새로운 가능성이 열릴지, 직접 실험해 보는 것이 가장 좋은 답입니다. 지금 바로 도전해 보세요!
