irfo
Moderatör
- Katılım
- 7 Ocak 2026
- Mesajlar
- 290
- Tepkime puanı
- 2
- Puanları
- 18
Python'ın esnekliği ve geniş kütüphane ekosistemi harikadır, ancak yoğun hesaplama gerektiren işlerde (veri işleme, kriptografi, karmaşık algoritmalar) yavaş kalabilir. PyO3, bu darboğazı aşmak için Python ve Rust arasında yüksek performanslı bir köprü kuran en popüler kütüphanedir.
PyO3 sayesinde Python ile yazılmış bir projeyi tamamen çöpe atmak yerine, sadece yavaş çalışan kısımları Rust ile yazıp bir Python modülü (
Rust Tarafı (
Rust
PyO3'ün Süper Gücü: Rust tarafında ağır bir işlem yaparken py.allow_threads(|| { ... }) bloğunu kullanarak GIL'i serbest bırakabilir ve Rust'ın gerçek çok çekirdekli (multi-core) performansından yararlanabilirsiniz. Bu, Python'ın normalde yapamadığı gerçek paralelliği sağlar.
PyO3 sayesinde Python ile yazılmış bir projeyi tamamen çöpe atmak yerine, sadece yavaş çalışan kısımları Rust ile yazıp bir Python modülü (
.so veya .pyd) olarak içeri aktarabilirsiniz.1. PyO3 Nasıl Çalışır?
PyO3, Rust kodunuzu Python yorumlayıcısının (CPython) anlayabileceği bir C genişletmesine dönüştürür. Rust'ın sahiplik (ownership) modelini Python'ın referans sayımı (reference counting) ile güvenli bir şekilde eşleştirir.2. Basit Bir Örnek: Rust Fonksiyonunu Python'a Taşımak
Bir Rust fonksiyonunu Python'dan çağrılabilir hale getirmek için#[pyfunction] ve #[pymodule] niteliklerini (attributes) kullanırız.Rust Tarafı (
src/lib.rs):Rust
Kod:
use pyo3::prelude::*;
/// İki sayıyı toplayan yoğun hesaplama simülasyonu
#[pyfunction]
fn topla_hizli(a: i64, b: i64) -> PyResult<i64> {
Ok(a + b)
}
/// Python modülünü tanımlıyoruz
#[pymodule]
fn benim_kutuphanem(_py: Python, m: &PyModule) -> PyResult<()> {
m.add_function(wrap_pyfunction!(topla_hizli, m)?)?;
Ok(())
}
3. Maturin: Paketleme Sihirbazı
PyO3 ile yazdığınız kodu Python'dapip install ile yüklenebilir bir paket haline getirmek için Maturin aracını kullanırız.maturin develop: Rust kodunu derler ve mevcut Python ortamınıza bir modül olarak anında yükler.maturin build: Dağıtılabilir.whl(wheel) dosyaları oluşturur.
4. Performans Karşılaştırması
Neden Python yerine Rust kullanmalısınız? İşte tipik bir senaryoda (örneğin ağır bir döngü veya matematiksel işlem) beklenen fark:| İşlem | Python (Native) | Rust (via PyO3) | Fark |
| Fibonacci (n=40) | ~25.4 sn | ~0.4 sn | ~60x Daha Hızlı |
| JSON İşleme | Orta | Çok Hızlı | ~5-10x Daha Hızlı |
| Bellek Kullanımı | Yüksek | Düşük | Daha Verimli |
5. GIL (Global Interpreter Lock) ve Paralellik
Python'ın en büyük kısıtlamalarından biri olan GIL, aynı anda sadece bir thread'in Python bytecode çalıştırmasına izin verir.PyO3'ün Süper Gücü: Rust tarafında ağır bir işlem yaparken py.allow_threads(|| { ... }) bloğunu kullanarak GIL'i serbest bırakabilir ve Rust'ın gerçek çok çekirdekli (multi-core) performansından yararlanabilirsiniz. Bu, Python'ın normalde yapamadığı gerçek paralelliği sağlar.
Özet
PyO3 kullanmak için şu adımları takip edersiniz:- Cargo.toml'a pyo3 bağımlılığını ekle.
- Rust fonksiyonlarını #[pyfunction] ile işaretle.
- maturin develop komutuyla modülü oluştur.
- Python içinde import benim_kutuphanem diyerek kullanmaya başla.