Mengapa Python belum dioptimalkan seperti implementasi Javascript modern?

11

Implementasi Javascript modern seperti V8 (Chrome), SpiderMonkey (Firefox), dan Chakra (IE / Edge) semuanya memiliki kompilasi JIT, dan sejumlah optimasi lainnya untuk meningkatkan kinerja.

Mengapa Python tidak memilikinya?

Saya telah melihat PyPy dan IronPython, yang keduanya mengklaim peningkatan kecepatan. PyPy Saya tidak mengerti bagaimana implementasi Python yang ditulis dengan Python, bahasa yang ditafsirkan, akan lebih cepat daripada implementasi referensi dalam C. IronPython, ide yang sama tetapi saya tidak melihat bagaimana .NET Framework akan meningkatkan kecepatan.

Jay
sumber
2
IronPython - seperti bahasa .NET lainnya - dikompilasi ke Microsoft "Common Intermediate Language" di mana ada implementasi kompiler JIT yang sangat matang.
Doc Brown
2
Bahasa pemrograman adalah spesifikasi (ditulis dalam beberapa dokumen), bukan perangkat lunak. Hanya implementasi bahasa pemrograman yang merupakan perangkat lunak (dan dapat berupa kompiler atau juru bahasa).
Basile Starynkevitch
1
@ BasileStarynkevitch: Saya tidak mengerti apa yang Anda coba sampaikan kepada kami dengan komentar ini. OP bertanya secara eksplisit tentang CPython, PyPy dan IronPython, yang merupakan implementasi Python spesifik.
Doc Brown
1
@DocBrown Sepertinya poin yang relevan untuk diangkat, diberikan paragraf terakhir dalam pertanyaan, yang menunjukkan kesalahpahaman ketika secara khusus menyebut Python bahasa yang diartikan.
8bittree

Jawaban:

19

Mengapa Python tidak memilikinya?

Saya tidak yakin mengapa Anda berpikir tidak ada implementasi Python yang peduli dengan kinerja. PyPy , IronPython , dan Jython adalah implementasi Python yang siap digunakan untuk industri yang peduli terhadap kinerja. Pyston adalah implementasi dalam pengembangan yang secara khusus dibuat untuk kinerja. Unladen Swallow dan Psyco juga proyek untuk meningkatkan kinerja Python.

Namun, fakta bahwa pengguna CPython jauh melebihi jumlah total basis pengguna gabungan dari semua implementasi lainnya, bahwa Unladen Swallow ditolak oleh komunitas, bahwa sebagian besar proyek ini mati atau berjuang untuk menarik pengembang harus memberi tahu Anda sesuatu tentang bagaimana Python kinerja nilai-nilai masyarakat.

Jawaban ini adalah contoh yang baik dari mentalitas khas komunitas Python: daripada memperbaiki masalah kinerja, mereka lebih suka menulis kode mereka bukan dengan Python.

Saya telah melihat PyPy dan IronPython, yang keduanya mengklaim peningkatan kecepatan. PyPy Saya tidak mengerti bagaimana implementasi Python yang ditulis dengan Python, bahasa yang ditafsirkan, akan lebih cepat daripada implementasi referensi dalam C.

Pertama: tidak peduli bahasa compiler ditulis dalam Setelah semua, compiler hanya dijalankan. Sekali , sehingga bahkan jika itu yang lambat, itu tidak masalah: kinerja compiler tidak relevan, apa yang relevan adalah kinerja output dari kompiler.

Kedua, karena itu hanya masalah seberapa cepat output dari kompiler, dan kompiler ditulis dengan Python, yaitu bahasa yang dikompilasi, itu benar-benar dapat membuat dirinya cepat dengan mengkompilasi sendiri.

Ketiga, tidak ada yang namanya "bahasa yang ditafsirkan". Bahasa adalah seperangkat aturan dan batasan matematika. Ini adalah spesifikasi. Selembar kertas. Bahasa tidak dikompilasi atau ditafsirkan. Bahasa apa adanya . Kompilasi dan interpretasi adalah ciri-ciri implementasi bahasa , lebih tepatnya, kompiler atau juru bahasa (duh!), Bukan bahasa. Setiap bahasa dapat diimplementasikan oleh kompiler. Setiap bahasa dapat diimplementasikan oleh penerjemah. Anda dapat secara otomatis menghasilkan kompiler dari seorang juru bahasa dan seorang juru bahasa dari sebuah kompiler.

Tetapi semua ini sebenarnya tidak terlalu penting, karena PyPy sebenarnya tidak ditulis dengan Python. Itu ditulis dalam RPython . RPython terdiri dari dua bagian, bahasa pemrograman RPython dan kerangka RPython.

Bahasa pemrograman RPython bukan Python. Ini adalah bahasa pemrograman yang berbeda. RPython adalah bahasa pemrograman yang diketik secara statis, kira-kira pada tingkat yang sama pada abstraksi seperti Jawa, dengan kinerja yang kira-kira sama dengan C. RPython adalah bagian sintaksis dan semantik dari Python, yang berarti bahwa setiap program RPython adalah program Python yang valid dan dapat dijalankan oleh implementasi Python (walaupun biasanya beberapa perintah besarnya lebih lambat, tetapi ini masih berguna untuk debugging karena Anda mendapatkan akses ke semua alat Python, dan interpretasi dimulai segera, sedangkan mengkompilasi implementasi bahasa biasanya memakan waktu sekitar 5-10 menit ), tetapi kebalikannya tidak benar.

Kerangka kerja RPython adalah kerangka kerja untuk menulis implementasi bahasa dinamis kinerja tinggi dalam bahasa pemrograman RPython. Ini termasuk pengumpul sampah, ruang objek, protokol meta-objek, objek yang ditentukan sebelumnya, jenis, dan operasi, dan sebagainya. Tetapi permata mahkota adalah kemampuannya untuk secara otomatis menghasilkan kompiler JIT dari juru bahasa: jika Anda menerapkan bahasa dalam kerangka RPython, Anda hanya perlu menulis juru bahasa, kerangka kerja RPython menangani JIT.

Ada banyak implementasi bahasa pada platform RPython , bukan hanya PyPy.

IronPython, ide yang sama tapi saya tidak melihat bagaimana .NET Framework akan meningkatkan kecepatan.

Sebagian besar implementasi ISO CLI, seperti berbagai varian .NET oleh Microsoft, atau Mono, berisi pengumpul, pengoptimal, dan kompiler sampah yang canggih. Hal yang sama berlaku untuk implementasi Jython dan Java.

IronPython adalah kompiler, ia mengkompilasi kode sumber Python ke pohon DLR (DLR adalah Dynamic Language Runtime), yang kemudian dikompilasi lebih lanjut ke kode byte CIL, yang kemudian biasanya dikompilasi lebih lanjut ke kode mesin asli.

Jörg W Mittag
sumber
6

Implementasi Javascript modern seperti V8 (Chrome), SpiderMonkey (Firefox), dan Chakra (IE / Edge) semuanya memiliki kompilasi JIT, dan sejumlah optimasi lainnya untuk meningkatkan kinerja.

Mengapa Python tidak memilikinya?

JavaScript termasuk dalam browser web dan sejumlah besar perangkat lunak saat ini dirancang untuk berjalan di browser web. Ini membuat kinerja JavaScript sangat penting sehingga perusahaan seperti Google, Apple dan Microsoft menginvestasikan banyak sumber daya dalam membuat runtime JavaScript dengan cepat. Seandainya aliran uang ini dialihkan ke Python, akan sama cepatnya.

PyPy Saya tidak mengerti bagaimana implementasi Python yang ditulis dengan Python, bahasa yang ditafsirkan, akan lebih cepat daripada implementasi referensi dalam C.

Idenya adalah bahwa begitu kode JIT-ed, itu tidak lagi "ditafsirkan". PyPI bekerja dengan mengubah kode Python menjadi kode mesin (mis. Kode mesin x86_64) yang kemudian langsung dieksekusi pada prosesor.

el.pescado
sumber
3
Yang sangat relevan adalah bahwa, di peramban web, tidak ada alternatif untuk JavaScript (atau setidaknya, belum ada yang secara umum tersedia di semua peramban utama). Jika Anda ingin kinerja cepat di browser web, maka Anda harus memiliki implementasi JavaScript yang cepat. Sedangkan pada platform yang menjalankan Python, Anda hampir dapat dipastikan pindah ke bahasa lain yang mungkin memiliki implementasi yang lebih baik.
8bittree
-3

Jika Anda menyusun kode python Anda menjadi modul dengan start-up tingkat atas yang sederhana sebagai file python utama, (dengan kode yang sangat sedikit di dalamnya), maka python mengkompilasi semua sisa kode Anda ke dalam kode byte bebas mesin, ini adalah .pyc file yang Anda lihat di struktur direktori Anda. Ini meminimalkan waktu pemuatan dan interpretasi setelah putaran pertama.

Jika Anda memulai skrip Anda dengan tanda -O atau -OO atau mengatur PYTHONOPTIMIZE ke nilai yang lebih besar dari 0 maka file .pyo dihasilkan yang dioptimalkan lebih lanjut.

Jika Anda memerlukan optimasi tinggi untuk beberapa fungsi tertentu, Anda dapat menuliskannya dalam C, C ++, FORTRAN atau GO dan kemudian menggunakannya dari dalam python.

Steve Barnes
sumber
Bagaimana Anda mengintegrasikan ekstensi non-C ke Python? Saya hanya mengetahui ekstensi-C untuk Cython.
1
@Bey: Pada dasarnya apa pun di pustaka bersama, (.dll atau .so), dapat dipanggil dari python asalkan Anda tahu tanda tangan fungsi - ini dapat dikonfigurasi secara manual, dihasilkan oleh alat seperti ayunan atau bahkan dihasilkan dari dokumentasi doxygen. stackoverflow.com/questions/5811949/… bermanfaat seperti halnya blog.heroku.com/see_python_see_python_go_go_python_go
Steve Barnes