Skip to main content

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

Published 4 min readMarkdown

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

파이썬은 읽기 쉬운 문법과 풍부한 라이브러리 덕분에 데이터 과학·웹 개발·자동화 등 다양한 분야에서 사랑받는 언어입니다. 하지만 인터프리터 기반이라 실행 속도가 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
  1. 코드 작성

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

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

  2. 빌드 및 설치

bash

   maturin develop   # 로컬 가상환경에 바로 설치
  1. 테스트
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가 만나면 어떤 새로운 가능성이 열릴지, 직접 실험해 보는 것이 가장 좋은 답입니다. 지금 바로 도전해 보세요!

No comments yet. Be the first to comment.

More from this blog