Apa itu PyPy? Python lebih cepat tanpa rasa sakit

Python telah mendapatkan reputasi sebagai yang kuat, fleksibel, dan mudah digunakan. Kebajikan ini telah menyebabkan penggunaannya dalam berbagai aplikasi, alur kerja, dan bidang yang sangat besar dan terus berkembang. Namun desain bahasa — sifatnya yang ditafsirkan, dinamisme runtime-nya — berarti bahwa Python selalu memiliki urutan yang lebih lambat daripada bahasa asli mesin seperti C atau C ++.

Selama bertahun-tahun, pengembang telah menemukan berbagai solusi untuk batasan kecepatan Python. Misalnya, Anda dapat menulis tugas yang membutuhkan banyak kinerja dalam C dan membungkusnya dengan Python; banyak perpustakaan pembelajaran mesin melakukan hal ini. Atau Anda dapat menggunakan Cython, sebuah proyek yang memungkinkan Anda memercikkan kode Python dengan informasi jenis runtime yang memungkinkannya untuk dikompilasi ke C.

Tetapi solusi tidak pernah ideal. Bukankah lebih bagus jika kita bisa mengambil program Python yang ada  apa adanya , dan menjalankannya secara dramatis lebih cepat? Itulah tepatnya yang PyPy izinkan untuk Anda lakukan.

Video terkait: Menggunakan runtime PyPy untuk Python

PyPy vs. CPython

PyPy adalah pengganti drop-in untuk interpreter Python stok, CPython. Sedangkan CPython mengkompilasi Python ke bytecode menengah yang kemudian diinterpretasikan oleh mesin virtual, PyPy menggunakan kompilasi just-in-time (JIT) untuk menerjemahkan kode Python ke dalam bahasa assembly asli mesin.

Bergantung pada tugas yang dilakukan, peningkatan kinerja bisa sangat dramatis. Rata-rata, PyPy mempercepat Python sekitar 7,6 kali, dengan beberapa tugas dipercepat 50 kali atau lebih. Penerjemah CPython sama sekali tidak melakukan jenis pengoptimalan yang sama seperti PyPy, dan mungkin tidak akan pernah, karena itu bukan salah satu tujuan desainnya.

Bagian terbaiknya adalah sedikit atau tanpa upaya yang diperlukan dari pihak pengembang untuk membuka kunci keuntungan yang diberikan PyPy. Cukup tukar CPython untuk PyPy, dan sebagian besar sudah selesai. Ada beberapa pengecualian, yang dibahas di bawah, tetapi tujuan yang dinyatakan PyPy adalah menjalankan kode Python yang ada dan tidak dimodifikasi dan menyediakannya dengan peningkatan kecepatan otomatis.

PyPy saat ini mendukung Python 2 dan Python 3, melalui berbagai inkarnasi proyek. Dengan kata lain, Anda perlu mengunduh berbagai versi PyPy tergantung pada versi Python yang akan Anda jalankan. Cabang Python 2 PyPy telah ada lebih lama, tetapi versi Python 3 telah dibawa ke kecepatan akhir-akhir ini. Saat ini mendukung Python 3.5 (kualitas produksi) dan Python 3.6 (kualitas beta).

Selain mendukung semua bahasa inti Python, PyPy bekerja dengan sebagian besar alat di ekosistem Python, seperti  pip untuk pengemasan atau  virtualenv untuk lingkungan virtual. Kebanyakan paket Python, bahkan yang memiliki modul C, harus berfungsi sebagaimana adanya, meskipun ada batasan yang akan kita bahas di bawah ini.

Bagaimana PyPy bekerja

PyPy menggunakan teknik pengoptimalan yang ditemukan di kompiler just-in-time lainnya untuk bahasa dinamis. Ini menganalisis menjalankan program Python untuk menentukan jenis informasi objek saat dibuat dan digunakan dalam program, kemudian menggunakan informasi jenis itu sebagai panduan untuk mempercepat. Misalnya, jika fungsi Python hanya bekerja dengan satu atau dua tipe objek yang berbeda, PyPy menghasilkan kode mesin untuk menangani kasus-kasus spesifik tersebut.

Pengoptimalan PyPy ditangani secara otomatis saat runtime, jadi Anda biasanya tidak perlu mengubah kinerjanya. Pengguna mahir mungkin bereksperimen dengan opsi baris perintah PyPy untuk menghasilkan kode yang lebih cepat untuk kasus khusus, tetapi ini jarang diperlukan.

PyPy juga menyimpang dari cara CPython menangani beberapa fungsi internal, tetapi mencoba untuk mempertahankan perilaku yang kompatibel. Misalnya, PyPy menangani pengumpulan sampah secara berbeda dari CPython. Tidak semua objek segera dikumpulkan begitu mereka keluar dari ruang lingkup, jadi program Python yang berjalan di bawah PyPy mungkin menunjukkan jejak memori yang lebih besar daripada saat berjalan di bawah CPython. Tapi Anda masih bisa menggunakan tingkat tinggi kontrol pengumpulan sampah Python terkena melalui gcmodul, seperti gc.enable(), gc.disable(), dan gc.collect().

Jika Anda menginginkan informasi tentang perilaku JIT PyPy saat runtime, PyPy menyertakan sebuah modul pypyjit, yang memaparkan banyak kait JIT ke aplikasi Python Anda. Jika Anda memiliki fungsi atau modul yang tampaknya berkinerja buruk dengan JIT, pypyjitAnda dapat memperoleh statistik terperinci tentangnya.

Modul khusus PyPy lainnya __pypy__,, memperlihatkan fitur lain yang khusus untuk PyPy, sehingga dapat berguna untuk menulis aplikasi yang memanfaatkan fitur tersebut. Karena dinamisme waktu proses Python, dimungkinkan untuk membuat aplikasi Python yang menggunakan fitur ini saat PyPy ada dan mengabaikannya jika tidak ada.

Batasan PyPy

Meskipun terlihat ajaib PyPy, ini bukanlah sihir. PyPy memiliki batasan tertentu yang mengurangi atau meniadakan efektivitasnya untuk jenis program tertentu. Sayangnya, PyPy bukanlah pengganti yang sepenuhnya universal untuk runtime stok CPython.

PyPy bekerja paling baik dengan aplikasi Python murni

PyPy selalu berkinerja terbaik dengan aplikasi Python "murni" - yaitu, aplikasi yang ditulis dengan Python dan tidak ada yang lain. Paket Python yang berinteraksi dengan pustaka C, seperti NumPy, juga tidak berfungsi karena cara PyPy mengemulasi antarmuka biner asli CPython. 

Pengembang PyPy telah mengurangi masalah ini, dan membuat PyPy lebih kompatibel dengan sebagian besar paket Python yang bergantung pada ekstensi C. Numpy, misalnya, sekarang bekerja sangat baik dengan PyPy. Tetapi jika Anda ingin kompatibilitas maksimum dengan ekstensi C, gunakan CPython.

PyPy bekerja paling baik dengan program yang berjalan lebih lama

Salah satu efek samping dari bagaimana PyPy mengoptimalkan program Python adalah program yang berjalan lebih lama mendapatkan keuntungan terbesar dari pengoptimalannya. Semakin lama program berjalan, semakin banyak informasi jenis waktu proses yang dapat dikumpulkan PyPy, dan semakin banyak pengoptimalan yang dapat dilakukan. Skrip Python yang sudah selesai tidak akan mendapat manfaat dari hal semacam ini. Aplikasi yang mendapatkan keuntungan biasanya memiliki loop yang berjalan untuk jangka waktu yang lama, atau berjalan terus menerus di latar belakang — kerangka kerja web, misalnya.

PyPy tidak melakukan kompilasi sebelumnya

PyPy  mengkompilasi  kode Python, tetapi ini bukan  kompiler  untuk kode Python. Karena cara PyPy melakukan pengoptimalan dan dinamisme yang melekat pada Python, tidak ada cara untuk mengeluarkan kode JITted yang dihasilkan sebagai biner mandiri dan menggunakannya kembali. Setiap program harus dikompilasi untuk setiap proses. Jika Anda ingin mengompilasi Python menjadi kode yang lebih cepat yang dapat dijalankan sebagai aplikasi mandiri, gunakan Cython, Numba, atau proyek Nuitka yang sedang eksperimental.