Python, yapay zeka ve veri analizi gibi alanlarda yaygın kullanılması ve hızlı kod yazmayı sağlaması gibi avantajlara sahip olsa da, yorumlanan bir dil olmasının kronik hız düşüklüğü sorunu pratikte baş ağrıtabilir.
Pratikte Python’un hız sorununu iyileştirmek için çeşitli alternatifler değerlendirilir. Python kodunun yalnızca ilk prototip olarak kullanılıp production’a geçerken Rust veya C/C++ ile yeniden geliştirildiği durumlar da vardır.
Ben, Python’dan vazgeçmeden hız sorununu çözmek için yeni bir alternatif olarak Rextio adlı bir aracı deneysel olarak geliştiriyorum.
Temel konsept, Python kodunun native’e dönüştürülebilen kısımlarını (type hint verilmiş statik kodlar vb.) otomatik olarak Rust koduna dönüştürüp binary olarak derleyerek performansı artırmak; native’e otomatik dönüşümü zor olan kısımları (dinamik kodlar vb.) ise olduğu gibi Python kodu olarak bırakıp (fallback) CPython ile çalıştırarak özgün Python kodunun mantığını korumaktır.
Kabaca şöyle ilerler.
Tipleri belirtilmiş Python projesi
-> desteklenen native adayların analizi
-> güvenli olmayan veya desteklenmeyen fonksiyonların reddedilmesi
-> kabul edilen fonksiyonlar için Rust + PyO3 üretilmesi
-> kalanlar için Python fallback wrapper üretilmesi
-> import uyumlu artifact’in derlenmesi
Ayrıntılar için lütfen bağlantıdaki Git repository dokümanlarına bakın.
Rextio ile dönüştürülmüş native binary’yi dahil ederek çalıştırıldığında, özgün Python kodunun CPython ile çalıştırılmasına kıyasla performans artışı da görülebiliyor.
- Temel Python kodu native’e dönüştürülüp çalıştırıldığında: 57.73×
- NumPy native’e dönüştürülüp çalıştırıldığında: 2.52×
- NetworkX native’e dönüştürülüp Dijkstra algoritması çalıştırıldığında: 3.68×
- pandas
Series.mapnative’e dönüştürülüp çalıştırıldığında: 66.14× - PyTorch deep MLP native’e dönüştürülüp çalıştırıldığında: 1.02× (mevcut Python paketinde C extension vb. kullanıldığı için hız artışı sınırlı)
- TensorFlow eager chain native’e dönüştürülüp çalıştırıldığında: 1.04× (mevcut Python paketinde C extension vb. kullanıldığı için hız artışı sınırlı)
Yukarıdaki sonuçların elde edildiği benchmark’ta kullanılan kaynak kodu ve çalışma ortamı bilgileri için rextio-benchmark Git repository’ye bakınız.
Bilgi olarak, Rextio’da Python kodunu dönüştürüp derlemeyi çalıştıran bir Core CLI var; ayrıca tek tek Python paketlerini Rust koduna dönüştürme kurallarını tanımlayan ek plugin’lerin oluşturulup buna eklenebileceği şekilde geliştiriyorum. Şu anda NumPy gibi bazı plugin’ler hazırlamış durumdayım (rextio-numpy, rextio-networkx, rextio-pandas, rextio-torch, rextio-tensorflow vb.) ve yukarıdaki benchmark sonuçları bu plugin’ler kullanılarak çalıştırılmış sonuçlardır.
Elbette Rextio hâlâ geliştirilmesi gereken çok şeyi olan erken aşama bir proje; her durumda Python kodunu Rust tabanlı native’e derlemek performans artışı getirmez.
Örneğin native kısım ile CPython fallback kısmı arasında sık veri alışverişi olursa, verinin dönüştürülüp sınırı geçmesi nedeniyle tam tersine hız düşüşü yaşanabilir. Ancak Rextio’da bu tür durumlarda, ilgili kısmı native’den geçirmek yerine tamamen CPython’a fallback ettirerek hız düşüşünü önlemeye yönlendirmeye çalışıyoruz.
Bir süredir tek başıma geliştiriyordum; artık bir ölçüde oturduğunu düşündüğüm için burada tanıtmak istedim.
Soru, görüş veya geri bildirimlerinizi iletirseniz mümkün olduğunca yanıtlayıp yansıtmaya çalışacağım.
Teşekkürler.
Henüz yorum yok.