DataScience
article thumbnail
Published 2023. 6. 30. 11:24
[Rust-Python] PyO3 Rust
728x90

PyO3는 파이썬에서 러스트 코드를 실행할수 있고 반대로 러스트에서 파이썬 코드를 실행할 수 있도록 도와주는 크레이트 입니다.

maturin

maturin으로 프로젝트를 생성합니다.
maturin init -b pyo3

프로젝트를 생성하면 아래와 같이 폴더가 만들어집니다.
.
├── Cargo.lock
├── Cargo.toml
├── Pipfile
├── pyproject.toml
├── src
└── lib.rs

Cargo.toml pyproject.toml 파일에서 패키지와 라이브러리 프로젝트 이름을 변경합니다.

라이브러리 크레이트를 만듭니다.

#[pyfunction],#[pymodule]은 PyO3 라이브러리에서 제공하는 Attribute입니다. 러스트 함수를 파이썬 함수로 정의하는데 사용합니다.
러스트 함수에 #[pyfunction] Attribute를 추가하면 PyO3는 해당 함수를 파이썬 모듈의 초기화 함수로 사용할 수 있는 코드를 생성합니다.
러스트 함수에 #[pymodule] Attribute를 추가하면 PyO3는 해당 함수를 파이썬 모듈의 초기화 함수로 사용할 수 있는 코드를 생성합니다.

모듈에 함수를 추가하려면 add_function메서드를 사용합니다. 모듈 내에서 함수를 호출 가능한 객체로 사용할 수 있습니다.
src/lib.rs

use pyo3::prelude::*;

fn _run(n: u64) -> u64 {
    match n {
        0 => 0,
        1 => 1,
        _ => _run(n - 1) + _run(n - 2),
    }
}

#[pyfunction]
fn run(n: u64) -> PyResult<u64> {
    Ok(_run(n))
}

/// A Python module implemented in Rust.
#[pymodule]
fn fibonacci(_py: Python, m: &PyModule) -> PyResult<()> {
    m.add_function(wrap_pyfunction!(run, m)?)?;
    Ok(())
}

파이썬에서 러스트 코드 실행해 보기

maturin develop

main.py를 추가해
피보나치 수열을 구하는 함수 pyrun 을 추가하고 러스트crate와 성능을 비교합니다.

python: 1.05, result: 9227465
rust: 0.06, result: 9227465

rust가 약 17배 빠른것을 확인할 수 있습니다.

maturin

maturin으로 프로젝트를 생성합니다.
maturin init -b pyo3

프로젝트를 생성하면 아래와 같이 폴더가 만들어집니다.
.
├── Cargo.lock
├── Cargo.toml
├── Pipfile
├── pyproject.toml
├── src
└── lib.rs

Cargo.toml pyproject.toml 파일에서 패키지와 라이브러리 프로젝트 이름을 변경합니다.

 

라이브러리 크레이트를 만듭니다.

#[pyfunction],#[pymodule]은 PyO3 라이브러리에서 제공하는 Attribute입니다. 러스트 함수를 파이썬 함수로 정의하는데 사용합니다.
러스트 함수에 #[pyfunction]Attribute를 추가하면 PyO3는 해당 함수를 파이썬 모듈의 초기화 함수로 사용할 수 있는 코드를 생성합니다.
러스트 함수에 #[pymodule]Attribute를 추가하면 PyO3는 해당 함수를 파이썬 모듈의 초기화 함수로 사용할 수 있는 코드를 생성합니다.

모듈에 함수를 추가하려면 add_function메서드를 사용합니다. 모듈 내에서 함수를 호출 가능한 객체로 사용할 수 있습니다.
src/lib.rs

use pyo3::prelude::*;

fn _run(n: u64) -> u64 {
    match n {
        0 => 0,
        1 => 1,
        _ => _run(n - 1) + _run(n - 2),
    }
}

#[pyfunction]
fn run(n: u64) -> PyResult<u64> {
    Ok(_run(n))
}

/// A Python module implemented in Rust.
#[pymodule]
fn fibonacci(_py: Python, m: &PyModule) -> PyResult<()> {
    m.add_function(wrap_pyfunction!(run, m)?)?;
    Ok(())
}

파이썬에서 러스트 코드 실행해 보기

maturin develop

main.py를 추가해
피보나치 수열을 구하는 함수 pyrun 을 추가하고 러스트crate와 성능을 비교합니다.

python: 1.05, result: 9227465
rust: 0.06, result: 9227465

rust가 약 17배 빠른것을 확인할 수 있습니다.

 

'Rust' 카테고리의 다른 글

[Rust] video-rs  (94) 2023.07.03
[Rust] ONNX모델로 detection  (23) 2023.07.02
Rust Trait  (160) 2023.06.20
Rust Generic 데이터 타입  (91) 2023.06.19
Rust testing  (142) 2023.06.15
profile

DataScience

@Ninestar

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!