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.
python-3.x
jit
Jay
sumber
sumber
Jawaban:
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.
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.
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.
sumber
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.
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.
sumber
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.
sumber