Dari Blog Google Open Source :
PyPy adalah implementasi ulang Python di Python, menggunakan teknik-teknik canggih untuk mencoba mencapai kinerja yang lebih baik daripada CPython. Kerja keras bertahun-tahun akhirnya membuahkan hasil. Hasil kecepatan kami sering mengalahkan CPython, mulai dari yang sedikit lebih lambat, hingga peningkatan hingga 2x pada kode aplikasi nyata, hingga peningkatan hingga 10x pada tolok ukur kecil.
Bagaimana ini mungkin? Implementasi Python mana yang digunakan untuk mengimplementasikan PyPy? CPython ? Dan apa peluang seorang PyPyPy atau PyPyPyPy mengalahkan skor mereka?
(Pada catatan terkait ... mengapa ada orang yang mencoba sesuatu seperti ini?)
python
pypy
language-implementation
Agnel Kurian
sumber
sumber
gcc
. Jadi, Anda juga dapat menulis beberapa kode python yang berjalan di CPython, yang menginterpretasikan beberapa kode python lainnya, menerjemahkannya ke C, dan mengeksekusigcc
, dan kemudian mengeksekusi program yang dikompilasi. Dan itu bisa lebih cepat, jika kodenya disebut cukup sering.Jawaban:
Q1. Bagaimana ini mungkin?
Manajemen memori manual (yang dilakukan CPython dalam penghitungannya) dapat lebih lambat daripada manajemen otomatis dalam beberapa kasus.
Keterbatasan dalam implementasi juru bahasa CPython menghalangi optimisasi tertentu yang dapat dilakukan PyPy (mis. Kunci berbutir halus).
Seperti yang disebutkan Marcelo, JIT. Mampu on the fly mengkonfirmasi jenis objek dapat menghemat kebutuhan Anda untuk melakukan beberapa pointer pointer untuk akhirnya tiba pada metode yang ingin Anda panggil.
Q2. Implementasi Python mana yang digunakan untuk mengimplementasikan PyPy?
Penerjemah PyPy diimplementasikan dalam RPython yang merupakan himpunan bagian dari Python yang diketik secara statis (bahasa dan bukan penerjemah CPython). - Rujuk https://pypy.readthedocs.org/en/latest/architecture.html untuk detailnya.
Q3. Dan apa peluang seorang PyPyPy atau PyPyPyPy mengalahkan skor mereka?
Itu akan tergantung pada implementasi dari penafsir hipotetis ini. Jika salah satu dari mereka, misalnya, mengambil sumbernya, melakukan semacam analisis terhadapnya dan mengkonversinya secara langsung menjadi kode perakitan khusus target yang ketat setelah berjalan untuk sementara waktu, saya membayangkan itu akan lebih cepat daripada CPython.
Pembaruan: Baru-baru ini, pada contoh yang dibuat dengan hati - hati , PyPy mengungguli program C serupa yang dikompilasi
gcc -O3
. Ini adalah kasus yang dibuat-buat tetapi menunjukkan beberapa ide.Q4. Mengapa ada orang yang mencoba sesuatu seperti ini?
Dari situs resmi. https://pypy.readthedocs.org/en/latest/architecture.html#mission-statement
C compiler gcc diimplementasikan dalam C, GHK compiler Haskell ditulis dalam Haskell. Apakah Anda punya alasan mengapa juru bahasa / kompiler Python tidak ditulis dalam Python?
sumber
"PyPy adalah implementasi ulang Python dengan Python" adalah cara yang agak menyesatkan untuk menggambarkan PyPy, IMHO, meskipun secara teknis itu benar.
Ada dua bagian utama PyPy.
Kerangka terjemahan adalah kompiler. Itu mengkompilasi kode RPython ke C (atau target lainnya), secara otomatis menambahkan dalam aspek-aspek seperti pengumpulan sampah dan kompiler JIT. Itu tidak dapat menangani kode Python sewenang-wenang, hanya RPython.
RPython adalah bagian dari Python normal; semua kode RPython adalah kode Python, tetapi tidak sebaliknya. Tidak ada definisi formal dari RPython, karena RPython pada dasarnya hanyalah "himpunan bagian dari Python yang dapat diterjemahkan oleh kerangka kerja terjemahan Pypy". Tetapi untuk diterjemahkan, kode RPython harus diketik secara statis (jenisnya disimpulkan, Anda tidak mendeklarasikannya, tetapi masih satu jenis per variabel), dan Anda tidak dapat melakukan hal-hal seperti mendeklarasikan / memodifikasi fungsi / kelas saat runtime juga.
Penerjemah kemudian adalah juru bahasa Python normal yang ditulis dalam RPython.
Karena kode RPython adalah kode Python normal, Anda dapat menjalankannya pada penerjemah Python apa pun. Tapi tidak ada klaim kecepatan PyPy yang datang dari menjalankannya seperti itu; ini hanya untuk siklus tes cepat, karena menerjemahkan penerjemah membutuhkan waktu lama .
Dengan memahami itu, harus segera jelas bahwa spekulasi tentang PyPyPy atau PyPyPyPy sebenarnya tidak masuk akal. Anda memiliki juru bahasa yang ditulis dalam RPython. Anda menerjemahkannya ke kode C yang mengeksekusi Python dengan cepat. Di sana proses berhenti; tidak ada lagi RPython untuk mempercepat dengan memprosesnya lagi.
Jadi "Bagaimana mungkin PyPy lebih cepat dari CPython" juga menjadi cukup jelas. PyPy memiliki implementasi yang lebih baik, termasuk kompiler JIT (umumnya tidak secepat tanpa kompiler JIT, saya percaya, yang berarti PyPy hanya lebih cepat untuk program yang rentan terhadap kompilasi JIT). CPython tidak pernah dirancang untuk menjadi implementasi yang sangat optimal dari bahasa Python (meskipun mereka mencoba membuatnya menjadi implementasi yang sangat optimal , jika Anda mengikuti perbedaannya).
Bagian proyek PyPy yang benar-benar inovatif adalah bahwa mereka tidak menulis skema GC canggih atau kompiler JIT dengan tangan. Mereka menulis interpreter relatif mudah dalam RPython, dan untuk semua RPython adalah tingkat yang lebih rendah daripada Python itu masih merupakan bahasa pengumpulan sampah berorientasi objek, tingkat yang jauh lebih tinggi daripada C. Kemudian kerangka terjemahan secara otomatis menambahkan hal-hal seperti GC dan JIT. Jadi kerangka terjemahannya sangat besarupaya, tetapi itu berlaku sama baiknya untuk juru bahasa python PyPy namun mereka mengubah implementasi mereka, memungkinkan untuk lebih banyak kebebasan dalam percobaan untuk meningkatkan kinerja (tanpa khawatir tentang memperkenalkan bug GC atau memperbarui kompiler JIT untuk mengatasi perubahan). Ini juga berarti ketika mereka berusaha menerapkan juru bahasa Python3, itu akan secara otomatis mendapatkan manfaat yang sama. Dan penterjemah lain yang ditulis dengan kerangka PyPy (yang ada sejumlah pada berbagai tahap polandia). Dan semua penerjemah yang menggunakan kerangka PyPy secara otomatis mendukung semua platform yang didukung oleh kerangka tersebut.
Jadi manfaat sebenarnya dari proyek PyPy adalah memisahkan (sebanyak mungkin) semua bagian dari penerapan juru bahasa independen platform yang efisien untuk bahasa yang dinamis. Dan kemudian muncul dengan satu implementasi yang baik dari mereka di satu tempat, yang dapat digunakan kembali di banyak penerjemah. Itu bukan kemenangan langsung seperti "program Python saya berjalan lebih cepat sekarang", tapi ini prospek yang bagus untuk masa depan.
Dan itu dapat menjalankan program Python Anda lebih cepat (mungkin).
sumber
PyPy diimplementasikan dalam Python, tetapi mengimplementasikan kompiler JIT untuk menghasilkan kode asli dengan cepat.
Alasan untuk mengimplementasikan PyPy di atas Python mungkin adalah itu hanya bahasa yang sangat produktif, terutama karena kompiler JIT membuat kinerja bahasa host agak tidak relevan.
sumber
PyPy ditulis dalam Python Terbatas. Itu tidak berjalan di atas juru bahasa CPython, sejauh yang saya tahu. Python terbatas adalah bagian dari bahasa Python. AFAIK, interpreter PyPy dikompilasi ke kode mesin, jadi ketika diinstal tidak menggunakan interpreter python saat runtime.
Pertanyaan Anda tampaknya mengharapkan interpreter PyPy berjalan di atas CPython saat menjalankan kode. Sunting: Ya, untuk menggunakan PyPy Anda pertama-tama menerjemahkan kode python PyPy, baik ke C dan membangun dengan gcc, ke kode byte jvm, atau ke kode .Net CLI. Lihat Memulai
sumber