Saya telah mendengar banyak tentang proyek PyPy . Mereka mengklaim itu 6,3 kali lebih cepat daripada juru bahasa CPython di situs mereka .
Setiap kali kita berbicara tentang bahasa dinamis seperti Python, kecepatan adalah salah satu masalah utama. Untuk mengatasi ini, mereka mengatakan PyPy adalah 6,3 kali lebih cepat.
Masalah kedua adalah paralelisme, Global Interpreter Lock (GIL) yang terkenal itu. Untuk ini, PyPy mengatakan itu dapat memberikan Python GIL-kurang .
Jika PyPy dapat mengatasi tantangan besar ini, apa kelemahannya yang mencegah adopsi yang lebih luas? Maksudnya, apa yang mencegah seseorang seperti saya, pengembang Python tipikal, beralih ke PyPy sekarang ?
Jawaban:
PyPy tidak mendukung numpyPyPy sekarang mendukung numpy . Beberapa ekstensi masih belum didukung (Pandas, SciPy, dll.), Lihat daftar paket yang didukung sebelum melakukan perubahan.masih eksperimental saat ini.baru saja mencapai stabil! Pada 20 Juni 2014, PyPy3 2.3.1 - Fulcrum keluar !Itulah alasan utama yang memengaruhi saya, menurut saya.
sumber
np.sum(M[1:2*n**2:2, :2*n**2] * M[:2*n**2:2, :2*n**2].conjugate(), axis=1)
?) Di Python dan itu membuat Python sangat cocok untuk komunitas ilmiah. Selain itu, melakukan bagian non-intensif dalam Python dan keluar ke C untuk loop intensif yang lebih kecil adalah strategi yang umum dan dapat digunakan.Situs itu tidak mengklaim PyPy adalah 6,3 kali lebih cepat dari CPython. Kutipan:
Ini adalah pernyataan yang sangat berbeda dengan pernyataan selimut yang Anda buat, dan ketika Anda memahami perbedaannya, Anda akan memahami setidaknya satu rangkaian alasan mengapa Anda tidak bisa hanya mengatakan "gunakan PyPy". Mungkin kedengarannya seperti saya memetik, tetapi memahami mengapa dua pernyataan ini sangat berbeda sangat penting.
Untuk memecahnya:
Pernyataan yang mereka buat hanya berlaku untuk tolok ukur yang mereka gunakan. Ia sama sekali tidak mengatakan apa-apa tentang program Anda (kecuali program Anda persis sama dengan salah satu tolok ukur mereka).
Pernyataan ini tentang rata - rata sekelompok tolok ukur. Tidak ada klaim bahwa menjalankan PyPy akan memberikan peningkatan 6,3 kali bahkan untuk program yang telah mereka uji.
Tidak ada klaim bahwa PyPy bahkan akan menjalankan semua program yang dijalankan CPython sama sekali , apalagi lebih cepat.
sumber
Karena pypy tidak 100% kompatibel, diperlukan 8 gigs ram untuk dikompilasi, adalah target yang bergerak, dan sangat eksperimental, di mana cpython stabil, target default untuk pembuat modul selama 2 dekade (termasuk ekstensi c yang tidak bekerja pada pypy ), dan sudah banyak digunakan.
Pypy kemungkinan tidak akan pernah menjadi implementasi referensi, tetapi ini adalah alat yang baik untuk dimiliki.
sumber
Pertanyaan kedua lebih mudah dijawab: Anda pada dasarnya dapat menggunakan PyPy sebagai pengganti drop-in jika semua kode Anda adalah Python murni. Namun, banyak perpustakaan yang banyak digunakan (termasuk beberapa perpustakaan standar) ditulis dalam C dan dikompilasi sebagai ekstensi Python. Beberapa di antaranya bisa dibuat bekerja dengan PyPy, beberapa tidak bisa. PyPy menyediakan alat "menghadap ke depan" yang sama dengan Python --- yaitu Python --- tetapi jeroan nya berbeda, jadi alat yang berinteraksi dengan jeroan tidak akan berfungsi.
Adapun pertanyaan pertama, saya membayangkan itu adalah semacam Catch-22 dengan yang pertama: PyPy telah berkembang pesat dalam upaya untuk meningkatkan kecepatan dan meningkatkan interoperabilitas dengan kode lain. Ini membuatnya lebih eksperimental daripada resmi.
Saya pikir itu mungkin bahwa jika PyPy masuk ke kondisi stabil, itu mungkin mulai semakin banyak digunakan. Saya juga berpikir itu akan bagus untuk Python untuk menjauh dari fondasi C-nya. Tetapi itu tidak akan terjadi untuk sementara waktu. PyPy belum mencapai massa kritis di mana ia hampir cukup berguna untuk melakukan semua yang Anda inginkan, yang akan memotivasi orang untuk mengisi kekosongan.
sumber
Saya melakukan patokan kecil pada topik ini. Sementara banyak dari poster lain telah membuat poin bagus tentang kompatibilitas, pengalaman saya adalah bahwa PyPy tidak jauh lebih cepat untuk hanya bergerak di sekitar bit. Untuk banyak penggunaan Python, sebenarnya hanya ada untuk menerjemahkan bit antara dua atau lebih layanan. Sebagai contoh, tidak banyak aplikasi web yang melakukan analisis intensif dataset dari CPU. Sebagai gantinya, mereka mengambil beberapa byte dari klien, menyimpannya dalam semacam database, dan kemudian mengembalikannya ke klien lain. Terkadang format data diubah.
Para BDFL dan pengembang CPython adalah sekelompok orang yang sangat cerdas dan telah berhasil membantu CPython tampil sangat baik dalam skenario seperti itu. Berikut plug blog yang tidak tahu malu: http://www.hydrogen18.com/blog/unpickling-buffers.html . Saya menggunakan Stackless, yang berasal dari CPython dan mempertahankan antarmuka modul C penuh. Saya tidak menemukan keuntungan menggunakan PyPy dalam kasus itu.
sumber
T: Jika PyPy dapat menyelesaikan tantangan besar ini (kecepatan, konsumsi memori, paralelisme) dibandingkan dengan CPython, apa kelemahannya yang mencegah adopsi yang lebih luas?
A: Pertama, ada sedikit bukti bahwa tim PyPy dapat menyelesaikan masalah kecepatan secara umum . Bukti jangka panjang menunjukkan bahwa PyPy menjalankan kode Python tertentu lebih lambat dari CPython dan kelemahan ini tampaknya berakar sangat dalam di PyPy.
Kedua, versi PyPy saat ini mengkonsumsi lebih banyak memori daripada CPython dalam satu set kasus yang agak besar. Jadi PyPy belum menyelesaikan masalah konsumsi memori.
Apakah PyPy memecahkan tantangan besar yang disebutkan dan secara umum akan lebih cepat, lebih sedikit memori, dan lebih ramah terhadap paralelisme daripada CPython adalah pertanyaan terbuka yang tidak dapat diselesaikan dalam jangka pendek. Beberapa orang bertaruh bahwa PyPy tidak akan pernah dapat menawarkan solusi umum yang memungkinkannya untuk mendominasi CPython 2.7 dan 3.3 dalam semua kasus.
Jika PyPy berhasil menjadi lebih baik daripada CPython secara umum, yang dipertanyakan, kelemahan utama yang mempengaruhi adopsi yang lebih luas adalah kompatibilitasnya dengan CPython. Ada juga masalah seperti fakta bahwa CPython berjalan pada rentang yang lebih luas dari CPU dan OS, tetapi masalah ini jauh lebih penting dibandingkan dengan kinerja PyPy dan tujuan kompatibilitas CPython.
T: Mengapa saya tidak bisa melakukan drop dalam penggantian CPython dengan PyPy sekarang?
A: PyPy tidak 100% kompatibel dengan CPython karena tidak mensimulasikan CPython di bawah tenda. Beberapa program mungkin masih bergantung pada fitur unik CPython yang tidak ada di PyPy seperti ikatan C, implementasi C objek Python & metode, atau sifat tambahan dari pengumpul sampah CPython.
sumber
CPython memiliki penghitungan referensi dan pengumpulan sampah, PyPy hanya memiliki pengumpulan sampah.
Jadi objek cenderung dihapus lebih awal dan
__del__
disebut dengan cara yang lebih mudah diprediksi di CPython. Beberapa perangkat lunak bergantung pada perilaku ini, sehingga mereka tidak siap untuk bermigrasi ke PyPy.Beberapa perangkat lunak lain berfungsi dengan baik, tetapi menggunakan lebih sedikit memori dengan CPython, karena objek yang tidak digunakan dibebaskan sebelumnya. (Saya tidak memiliki pengukuran apa pun untuk menunjukkan seberapa signifikan hal ini dan detail implementasi apa yang memengaruhi penggunaan memori.)
sumber
__del__
dipanggil lebih awal atau sama sekali salah bahkan dalam CPython. Seperti yang Anda katakan, biasanya berfungsi dan beberapa orang menganggapnya sebagai jaminan. Jika sesuatu yang mereferensikan objek terperangkap dalam siklus referensi (yang agak mudah - tahukah Anda bahwa memeriksa pengecualian saat ini dengan cara yang tidak dibuat-buat menciptakan siklus referensi?) Finalisasi tertunda tanpa batas waktu, sampai siklus berikutnya GC (yang mungkin tidak pernah ). Jika objek itu sendiri merupakan bagian dari siklus referensi,__del__
tidak akan dipanggil sama sekali (sebelum Python 3.4).Untuk banyak proyek, sebenarnya ada perbedaan 0% antara ular sanca yang berbeda dalam hal kecepatan. Itu adalah yang didominasi oleh waktu teknik dan di mana semua ular sanca memiliki jumlah dukungan perpustakaan yang sama.
sumber
Untuk menyederhanakan ini: PyPy menyediakan kecepatan yang tidak dimiliki oleh CPython tetapi mengorbankan kompatibilitasnya. Namun, kebanyakan orang memilih Python karena fleksibilitasnya dan fitur "termasuk baterai" (kompatibilitas tinggi), bukan karena kecepatannya (itu masih lebih disukai).
sumber
Saya telah menemukan contoh, di mana PyPy lebih lambat dari Python. Tetapi: Hanya di Windows.
Jadi, jika Anda berpikir tentang PyPy, lupakan Windows. Di Linux, Anda dapat mencapai akselerasi yang luar biasa. Contoh (sebutkan semua bilangan prima antara 1 dan 1.000.000):
Ini berjalan 10 (!) Kali lebih cepat pada PyPy daripada pada Python. Tapi tidak di windows. Itu hanya 3x lebih cepat.
sumber
PyPy telah memiliki dukungan Python 3 untuk sementara waktu, tetapi menurut posting HackerNoon ini oleh Anthony Shaw dari 2 April 2018 , PyPy3 masih beberapa kali lebih lambat daripada PyPy (Python 2).
Untuk banyak perhitungan ilmiah, terutama perhitungan matriks, numpy adalah pilihan yang lebih baik (lihat FAQ: Haruskah saya menginstal numpy atau numpypy? ).
Pypy tidak mendukung gmpy2. Sebagai gantinya, Anda dapat menggunakan gmpy_cffi meskipun saya belum menguji kecepatannya dan proyek ini memiliki satu rilis pada tahun 2014.
Untuk masalah Project Euler, saya sering menggunakan PyPy, dan untuk perhitungan numerik sederhana seringkali
from __future__ import division
cukup untuk tujuan saya, tetapi dukungan Python 3 masih dikerjakan pada 2018, dengan taruhan terbaik Anda adalah pada 64-bit Linux. Windows PyPy3.5 v6.0, yang terbaru pada Desember 2018, masih dalam versi beta.sumber
Versi Python yang didukung
Untuk mengutip Zen Python :
Sebagai contoh, Python 3.7 memperkenalkan dataclasses dan Python 3.8 memperkenalkan fstring = .
Mungkin ada fitur lain di Python 3.7 dan Python 3.8 yang lebih penting bagi Anda. Intinya adalah bahwa PyPy tidak mendukung Python 3.7 atau Python 3.8 saat ini.
sumber