Apa itu PyPy? Python lebih cepat tanpa rasa sakit

Python telah memperoleh reputasi sebagai kuat, fleksibel, dan senang bekerja. Kebajikan ini menyebabkan penggunaannya dalam berbagai aplikasi, alur kerja, dan bidang yang besar dan berkembang. Tetapi reka bentuk bahasa - sifatnya yang ditafsirkan, dinamisme runtime - bermaksud bahawa Python selalu menjadi urutan besarnya lebih lambat daripada bahasa asli mesin seperti C atau C ++.

Selama bertahun-tahun, pembangun telah menghasilkan pelbagai penyelesaian untuk had kelajuan Python. Sebagai contoh, anda boleh menulis tugas-tugas intensif prestasi di C dan membungkusnya dengan Python; banyak perpustakaan pembelajaran mesin melakukan perkara ini. Atau anda boleh menggunakan Cython, sebuah projek yang membolehkan anda menaburkan kod Python dengan maklumat jenis runtime yang memungkinkannya disusun ke C.

Tetapi penyelesaian tidak pernah ideal. Bukankah lebih baik sekiranya kita dapat mengikuti program Python yang ada  seperti sekarang , dan menjalankannya dengan lebih cepat secara mendadak? Itulah yang PyPy benarkan untuk anda lakukan.

Video berkaitan: Menggunakan runtime PyPy untuk Python

PyPy vs CPython

PyPy adalah pengganti drop-in untuk jurubahasa saham Python, CPython. Manakala CPython menyusun Python menjadi kod bytek perantaraan yang kemudian ditafsirkan oleh mesin maya, PyPy menggunakan kompilasi tepat-masa (JIT) untuk menterjemahkan kod Python ke dalam bahasa pemasangan mesin-asli.

Bergantung pada tugas yang sedang dilakukan, kenaikan prestasi dapat menjadi sangat dramatik. Rata-rata, PyPy mempercepat Python sekitar 7.6 kali, dengan beberapa tugas dipercepat 50 kali atau lebih. Jurubahasa CPython tidak melakukan pengoptimuman yang sama seperti PyPy, dan mungkin tidak akan pernah berlaku, kerana itu bukan salah satu tujuan reka bentuknya.

Bahagian yang terbaik adalah usaha kecil dan tidak diperlukan dari pihak pembangun untuk mendapatkan keuntungan yang diberikan oleh PyPy. Cukup tukar CPython untuk PyPy, dan selalunya anda sudah selesai. Terdapat beberapa pengecualian, yang dibincangkan di bawah, tetapi tujuan yang dinyatakan oleh PyPy adalah menjalankan kod Python yang sudah ada dan tidak diubah suai dan memberikannya peningkatan laju automatik.

PyPy kini menyokong kedua-dua Python 2 dan Python 3, dengan penjelmaan projek yang berbeza. Dengan kata lain, anda perlu memuat turun versi PyPy yang berbeza bergantung pada versi Python yang akan anda jalankan. Cawangan Python 2 dari PyPy telah lama lebih lama, tetapi versi Python 3 telah dipercepat sehingga akhir-akhir ini. Pada masa ini ia menyokong kedua-dua Python 3.5 (kualiti pengeluaran) dan Python 3.6 (kualiti beta).

Selain mendukung semua bahasa inti Python, PyPy bekerja dengan sebilangan besar alat dalam ekosistem Python, seperti  pip untuk pembungkusan atau  virtualenv untuk persekitaran maya. Sebilangan besar pakej Python, walaupun dengan modul C, harus berfungsi sebagaimana mestinya, walaupun ada batasan yang akan kita bahas di bawah.

Bagaimana PyPy berfungsi

PyPy menggunakan teknik pengoptimuman yang terdapat dalam penyusun tepat waktu untuk bahasa dinamik. Ia menganalisis menjalankan program Python untuk menentukan jenis maklumat objek seperti yang dibuat dan digunakan dalam program, kemudian menggunakan maklumat jenis itu sebagai panduan untuk mempercepat sesuatu. Sebagai contoh, jika fungsi Python hanya berfungsi dengan satu atau dua jenis objek yang berlainan, PyPy menghasilkan kod mesin untuk menangani kes-kes tertentu.

Pengoptimuman PyPy dikendalikan secara automatik pada waktu berjalan, jadi anda biasanya tidak perlu mengubah kinerjanya. Pengguna yang maju mungkin bereksperimen dengan pilihan baris perintah PyPy untuk menghasilkan kod yang lebih pantas untuk kes khas, tetapi jarang diperlukan.

PyPy juga menjauh dari cara CPython menangani beberapa fungsi dalaman, tetapi cuba mengekalkan tingkah laku yang serasi. Sebagai contoh, PyPy menangani pengumpulan sampah secara berbeza daripada CPython. Tidak semua objek segera dikumpulkan setelah mereka berada di luar ruang lingkup, jadi program Python yang berjalan di bawah PyPy mungkin menunjukkan jejak memori yang lebih besar daripada ketika berjalan di bawah CPython. Tetapi anda masih boleh menggunakan peringkat tinggi kawalan kutipan sampah Python s didedahkan melalui gcmodul, seperti gc.enable(), gc.disable(), dan gc.collect().

Sekiranya anda mahukan maklumat mengenai tingkah laku JIT PyPy semasa waktu berjalan, PyPy menyertakan modul pypyjit, yang memperlihatkan banyak kaitan JIT pada aplikasi Python anda. Sekiranya anda mempunyai fungsi atau modul yang nampaknya tidak berfungsi dengan baik dengan JIT, pypyjitmembolehkan anda mendapatkan statistik terperinci mengenainya.

Satu lagi modul khusus PyPy __pypy__, memperlihatkan ciri lain yang khusus untuk PyPy, jadi boleh berguna untuk menulis aplikasi yang memanfaatkan ciri tersebut. Oleh kerana dinamisme runtime Python, adalah mungkin untuk membina aplikasi Python yang menggunakan ciri-ciri ini semasa PyPy hadir dan mengabaikannya ketika tidak.

Batasan PyPy

Ajaib seperti yang kelihatan PyPy, itu bukan sihir. PyPy mempunyai batasan tertentu yang mengurangkan atau menghilangkan keberkesanannya untuk jenis program tertentu. Sayangnya, PyPy bukan pengganti yang sepenuhnya universal untuk jangka masa CPython stok.

PyPy berfungsi paling baik dengan aplikasi Python tulen

PyPy selalu menunjukkan prestasi terbaik dengan aplikasi Python yang “tulen” - iaitu aplikasi yang ditulis dalam Python dan tidak ada yang lain. Pakej Python yang berinteraksi dengan perpustakaan C, seperti NumPy, tidak berjaya juga kerana cara PyPy meniru antara muka binari asli CPython. 

Pembangun PyPy telah mempermasalahkan masalah ini, dan menjadikan PyPy lebih serasi dengan kebanyakan pakej Python yang bergantung pada sambungan C. Numpy, misalnya, berfungsi dengan baik dengan PyPy sekarang. Tetapi jika anda mahukan keserasian maksimum dengan sambungan C, gunakan CPython.

PyPy berfungsi paling baik dengan program yang berjalan lebih lama

Salah satu kesan sampingan bagaimana PyPy mengoptimumkan program Python adalah bahawa program yang berjalan lebih lama mendapat banyak manfaat daripada pengoptimumannya. Semakin lama program ini dijalankan, semakin banyak maklumat jenis run-time yang dapat dikumpulkan oleh PyPy, dan semakin banyak pengoptimuman yang dapat dibuatnya. Skrip Python satu-dan-dilakukan tidak akan mendapat faedah daripada perkara semacam ini. Aplikasi yang mendapat keuntungan biasanya memiliki gelung yang berjalan untuk jangka waktu yang lama, atau berjalan terus-menerus di latar belakang — kerangka web, misalnya.

PyPy tidak melakukan penyusunan lebih awal

PyPy  menyusun  kod Python, tetapi bukan  penyusun  kod Python. Kerana cara PyPy melakukan pengoptimumannya dan dinamisme Python yang wujud, tidak ada cara untuk mengeluarkan kod JITted yang dihasilkan sebagai binari mandiri dan menggunakannya semula. Setiap program mesti disusun untuk setiap larian. Sekiranya anda ingin menyusun Python ke dalam kod yang lebih pantas yang dapat dijalankan sebagai aplikasi mandiri, gunakan Cython, Numba, atau projek Nuitka yang sedang dijalankan.