irfo
Moderatör
- Katılım
- 7 Ocak 2026
- Mesajlar
- 290
- Tepkime puanı
- 2
- Puanları
- 18
Python'un kullanım kolaylığı ve zengin kütüphane ekosistemi ile Rust'ın yüksek performansı ve bellek güvenliğini birleştirmek isterseniz, PyO3 bu işin anahtarıdır. PyO3, Python için yerel (native) Rust eklentileri yazmanızı veya Rust içinden Python kodunu çağırmanızı sağlayan bir köprüdür.
Özellikle Python'da yavaş çalışan veri işleme, matematiksel hesaplama veya karmaşık algoritma kısımlarını Rust ile yazıp Python'da bir paket gibi kullanmak, performans darboğazlarını aşmanın en modern yoludur.
Kurulum:
Bash
Bu kodu
Özellikle Python'da yavaş çalışan veri işleme, matematiksel hesaplama veya karmaşık algoritma kısımlarını Rust ile yazıp Python'da bir paket gibi kullanmak, performans darboğazlarını aşmanın en modern yoludur.
1. PyO3 Nasıl Çalışır?
PyO3, Rust kodunuzu Python'un C-API'sine bağlar. Python, Rust tarafından üretilen kütüphaneyi sanki bir C eklentisiymiş gibi görür. Ancak geliştirici için C ile uğraşmak yerine Rust'ın güvenli dünyasında kalmak büyük bir avantajdır.2. Proje Kurulumu ve Matur
PyO3 projelerini yönetmek için genellikle Maturin kullanılır. Maturin, Rust projelerini Python paketlerine dönüştüren bir derleme aracıdır.Kurulum:
Bash
Kod:
pip install maturin
maturin init # Proje şablonunu oluşturur
Cargo.toml dosyanızda şu bağımlılıklar yer almalıdır:
Kod:
[lib] name = "rust_modulum" crate-type = ["cdylib"] # C-uyumlu dinamik kütüphane
[dependencies.pyo3] version = "0.20" features = ["extension-module"]
3. İlk Rust Modülünüzü Yazmak
Rust tarafında bir fonksiyon yazıp bunu Python'a nasıl ihraç edeceğimize bakalım.
Kod:
use pyo3::prelude::*;
/// İki sayıyı toplayan ve Python'dan çağrılabilen fonksiyon #[pyfunction] fn topla(a: i64, b: i64) -> PyResult<i64> { Ok(a + b) }
/// Python modülünün tanımı #[pymodule] fn rust_modulum(_py: Python, m: &PyModule) -> PyResult<()> { m.add_function(wrap_pyfunction!(topla, m)?)?; Ok(()) }
maturin develop komutuyla derlediğinizde, Python içinde şu şekilde kullanabilirsiniz:
Python:
import rust_modulum sonuc = rust_modulum.topla(10, 20) print(f"Rust'tan gelen sonuç: {sonuc}")
4. Tip Dönüşümleri (Type Mapping)
PyO3, Rust ve Python arasındaki tipleri otomatik olarak eşleştirir. Bu sayede karmaşık veri yapılarını taşımak oldukça kolaydır.| Python Tipi | Rust Tipi |
int | i32, u32, i64 vb. |
float | f32, f64 |
str | String, &str |
list | Vec<T> |
dict | HashMap<K, V> |
None | Option<T> |
5. GIL (Global Interpreter Lock) Yönetimi
Python'un meşhur GIL mekanizması, çoklu iş parçacığı kullanımını kısıtlar. Rust tarafında yoğun bir hesaplama yaparken GIL'i serbest bırakarak (release), Python'un diğer işleri yapmaya devam etmesini sağlayabilirsiniz. Bu, paralel programlama için kritik bir özelliktir.
Kod:
py.allow_threads(|| {// Burada yapılan ağır hesaplamalar Python'un GIL kilidini engellemez.});
6. Performans: Ne Zaman Kullanmalı?
Python kodunuzu Rust'a taşımak her zaman mucize yaratmaz. Küçük işlemler için Python ve Rust arasındaki veri taşıma maliyeti (overhead), kazandığınız hızdan daha fazla olabilir. Ancak şu durumlarda Rust ve PyO3 rakipsizdir:- Yoğun Döngüler: Milyonlarca kez dönen matematiksel işlemler.
- Bellek Yönetimi: Büyük verilerin (Big Data) bellekte verimli tutulması.
- Paralelleştirme: Python'un kısıtlı kaldığı çok çekirdekli işlemler.