brunch

You can make anything
by writing

C.S.Lewis

by 유윤식 Feb 18. 2023

Python: Maturin#01

#CPython #Rust #Maturin #

Maturin

https://www.maturin.rs/index.html

이거 왜쓰나?

파이썬이 느린데...  이걸 어쩌지... 고민할 때가 바로 maturin 을 고려해볼 때!


왜 빠르나?

Rust 는 C++와 거의 대등한 정도의 퍼포먼스를 보여주는 언어!


예를 들어보자!

재귀함수를 파이썬에서 돌려보면.. 기가막힌다.

먼저 피보나치함수를 재귀 형태로 만들어 간단하게 돌려보면,


# python_recursive_test.py

import time


def fib_sum(i):

    if i == 1:

        return 1

    if i == 2:

        return 1

    return fib_sum(i-2) + fib_sum(i-1)


st = time.time()

for i in range(2, 40):

    print(i, fib_sum(i))

print(f'py lap time : {time.time() - st}')


이렇게 간단한 함수를 실행해보면 대략 

py lap time : 22.059756994247437

기록을 보여준다.


이걸 똑같이 Rust 로 만들어서 python 에서 import 해서 사용해본다.


# rust_recursive_test.py

import time

from rust_recursive_proj import *


st = time.time()

for i in range(2, 40):

    print(i, recursive_as_isize(i))

print(f'rust lap time : {time.time() - st}')


# rust_recursive_proj.rs

use pyo3::prelude::*;


pub fn fib(i: i64) -> i64 {

    if i == 1 { return 1; }

    if i == 2 { return 1; }

    return fib(i-2) + fib(i-1);

}


#[pyfunction]

pub fn recursive_as_isize(n: i64) -> PyResult<i64> {

    Ok(fib(n))

}


/// A Python module implemented in Rust.

#[pymodule]

pub fn rust_recursive_proj(_py: Python, m: &PyModule) -> PyResult<()> {

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

    Ok(())

}


해당 rust 파일을 컴파일해서 파이썬에서 모듈로 가져다 사용하는 방법은

위에 공식자료를 통해서 금방 파악할 수 있다.


랩타임은 rust lap time : 0.8686699867248535


퍼포먼스 적으로 느껴지는 부분이 많다!


아직 멀티프로세스를 활용하거나 하는 수준의 비교는 아니지만,

프로젝트를 진행함에 있어서 파이썬의 파워를 높일 수 있다는 점에서 긍정적으로 느껴졌다.


끝!

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari