Python banyak digunakan di AI, analisis data, dan bidang lain karena memungkinkan coding cepat, tetapi masalah penurunan performa yang melekat pada bahasa interpreter sering kali menjadi sumber kerepotan di praktik kerja nyata.
Di lapangan, ada berbagai alternatif yang dipertimbangkan untuk memperbaiki masalah kecepatan Python. Ada juga kasus di mana kode Python hanya dipakai sebagai prototipe awal lalu dikembangkan ulang dalam Rust atau C/C++ saat beralih ke production.
Saya sedang secara eksperimental mengembangkan alat bernama Rextio sebagai alternatif baru untuk menyelesaikan masalah performa tanpa harus meninggalkan Python.
Konsep dasarnya adalah mengambil bagian kode Python yang bisa diubah ke native (seperti kode statis dengan type hint), lalu otomatis mengonversinya menjadi kode Rust dan mengompilasinya menjadi biner untuk meningkatkan performa, sementara bagian yang sulit diubah otomatis ke native (seperti kode dinamis) dibiarkan tetap sebagai kode Python (fallback) dan dijalankan dengan CPython agar logika asli kode Python tetap terjaga.
Secara garis besar alurnya sebagai berikut.
Proyek Python yang tipenya sudah ditentukan
-> analisis kandidat native yang didukung
-> tolak fungsi yang tidak aman atau tidak didukung
-> fungsi yang diterima menghasilkan Rust + PyO3
-> sisanya menghasilkan Python fallback wrapper
-> bangun artifact yang kompatibel dengan import
Untuk detail lebih lanjut, silakan lihat dokumentasi di Git repository pada tautan tersebut.
Saat membandingkan eksekusi yang menyertakan biner native hasil konversi Rextio dengan eksekusi kode Python asli di CPython, peningkatan performa juga dapat terlihat.
- Saat kode Python dasar dikonversi ke native lalu dijalankan: 57.73×
- Saat NumPy dikonversi ke native lalu dijalankan: 2.52×
- Saat NetworkX dikonversi ke native lalu menjalankan algoritma Dijkstra: 3.68×
- Saat
Series.mapmilik pandas dikonversi ke native lalu dijalankan: 66.14× - Saat deep MLP PyTorch dikonversi ke native lalu dijalankan: 1.02× (peningkatan kecepatan terbatas karena paket Python yang ada sudah menggunakan C extension, dll.)
- Saat TensorFlow eager chain dikonversi ke native lalu dijalankan: 1.04× (peningkatan kecepatan terbatas karena paket Python yang ada sudah menggunakan C extension, dll.)
Untuk kode sumber dan informasi lingkungan eksekusi yang digunakan dalam benchmark di atas, silakan merujuk ke rextio-benchmark Git repository.
Sebagai informasi, Rextio memiliki Core CLI yang mengonversi kode Python dan menjalankan kompilasi, dan sedang dikembangkan agar bisa ditambahi plugin tambahan yang mendefinisikan aturan untuk mengonversi masing-masing paket Python menjadi kode Rust. Saat ini beberapa plugin seperti NumPy sudah dibuat sebagian (rextio-numpy, rextio-networkx, rextio-pandas, rextio-torch, rextio-tensorflow, dll.), dan hasil benchmark di atas merupakan hasil yang dijalankan dengan memanfaatkan plugin-plugin tersebut.
Tentu saja, Rextio masih merupakan proyek awal yang perlu banyak perbaikan, dan mengompilasi kode Python menjadi native berbasis Rust tidak selalu menghasilkan peningkatan performa dalam semua situasi.
Sebagai contoh, jika pertukaran data antara bagian native dan bagian fallback CPython terlalu sering terjadi, data harus dikonversi saat melintasi batas tersebut sehingga justru bisa menurunkan performa. Namun di Rextio, untuk kasus seperti ini sistem diarahkan agar bagian tersebut seluruhnya di-fallback ke CPython tanpa melewati native, sehingga penurunan performa bisa dicegah.
Selama ini saya mengembangkannya sendirian, dan karena rasanya sudah cukup matang, saya memperkenalkannya di sini.
Jika ada pertanyaan atau masukan, saya akan berusaha menjawab dan menerapkannya semaksimal mungkin.
Terima kasih.
1 komentar
Ada numba sebagai pendekatan kompilasi JIT dengan ide serupa, tetapi ini terasa punya cakupan yang lebih luas.