Mengapa saya tidak boleh menggunakan PyPy melalui CPython jika PyPy 6.3 kali lebih cepat?

684

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 ?

chhantyal
sumber
30
Membersihkan komentar karena sebagian besar adalah hal-hal yang harus disempurnakan dalam jawaban (dan dalam beberapa kasus), atau tidak boleh dikatakan sama sekali. Juga diedit untuk mengatasi beberapa masalah yang diangkat mengenai subjektivitas pertanyaan ini. Silakan coba jawab dengan menggunakan fakta, dan buat cadangan pernyataan dengan sumber jika memungkinkan!
Shog9
3
Saya sudah banyak menggunakan Pypy. Itu cenderung bekerja dengan sangat baik. Namun, sementara Pypy sedikit lebih cepat untuk banyak beban kerja CPU-berat, itu sebenarnya lebih lambat untuk beban kerja I / O-berat yang saya lontarkan. Sebagai contoh, saya menulis program cadangan deduplicating yang disebut backshift. Untuk cadangan awal, yang melakukan banyak chunking file, pypy sangat bagus. Tetapi untuk cadangan berikutnya yang sebagian besar hanya memperbarui cap waktu, CPython lebih cepat.
dstromberg

Jawaban:

657

CATATAN: PyPy lebih dewasa dan lebih baik didukung sekarang daripada di 2013, ketika pertanyaan ini diajukan. Hindari menarik kesimpulan dari informasi yang ketinggalan zaman.


  1. PyPy, seperti orang lain telah cepat untuk menyebutkan, memiliki dukungan lemah untuk C ekstensi . Ini memiliki dukungan, tetapi biasanya pada kecepatan lebih lambat dari Python dan rapuh di terbaik. Karenanya banyak modul hanya membutuhkan CPython. PyPy tidak mendukung numpy PyPy sekarang mendukung numpy . Beberapa ekstensi masih belum didukung (Pandas, SciPy, dll.), Lihat daftar paket yang didukung sebelum melakukan perubahan.
  2. Dukungan Python 3 masih eksperimental saat ini. baru saja mencapai stabil! Pada 20 Juni 2014, PyPy3 2.3.1 - Fulcrum keluar !
  3. PyPy kadang - kadang sebenarnya tidak lebih cepat untuk "skrip", yang digunakan banyak orang untuk Python. Ini adalah program jangka pendek yang melakukan sesuatu yang sederhana dan kecil. Karena PyPy adalah kompiler JIT, keuntungan utamanya berasal dari waktu jangka panjang dan tipe sederhana (seperti angka). Terus terang, kecepatan pra-JIT PyPy cukup buruk dibandingkan dengan CPython.
  4. Kelembaman . Pindah ke PyPy sering membutuhkan retooling, yang bagi sebagian orang dan organisasi terlalu banyak pekerjaan.

Itulah alasan utama yang memengaruhi saya, menurut saya.

Veedrac
sumber
14
Bagus bahwa Anda menyebutkan retooling. Host web saya, misalnya, memiliki pilihan antara Python 2.4 dan 2.5; dan "produsen utama perangkat lunak hiburan" di dekat saya menggunakan 2.6 tanpa rencana untuk segera ditingkatkan. Kadang-kadang itu bisa menjadi upaya besar dan mahal untuk menemukan biaya konversi.
Mike Housky
19
PyPy menjadi "secepat C" lebih banyak tentang C generik daripada pustaka C-multithreaded cache yang dioptimalkan untuk numerik. Untuk numerik, Python hanya digunakan untuk mengangkut pointer ke array besar. Jadi PyPy menjadi "secepat C" berarti "pointer + metadata Anda bergerak secepat C". Bukan masalah besar. Lalu mengapa repot-repot dengan Python? Pergi melihat fungsi tanda tangan di cblas dan lapacke.
cjordan1
12
@ cjordan1: Saya tidak mengerti apa yang Anda katakan. Konstruksi numpy tingkat tinggi sangat ekspresif ( 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.
Veedrac
26
@ Veedrac Itulah yang saya maksud. Seperti pada "Lihat fungsi tanda tangan di cblas dan lapacke" karena mereka sangat panjang dan sulit digunakan sehingga Anda akan langsung mengerti mengapa kami menggunakan Python untuk mengangkut di sekitar pointer dan metadata.
cjordan1
5
@ tommy.carstensen Ini sebenarnya bukan tempat yang bagus untuk membahas secara mendalam, tapi saya akan coba. 1. Ini jauh lebih benar ketika saya menulisnya daripada sekarang. 2. "Script" seringkali berat. IO PyPy masih sering lebih lambat dari CPython - ini biasanya jauh lebih lambat. 3. PyPy dulu lebih lambat dari CPython dalam menangani string - sekarang sering lebih baik dan jarang lebih buruk. 4. Banyak "skrip" hanya kode lem - membuat penerjemah lebih cepat tidak akan meningkatkan runtime keseluruhan dalam kasus itu. 5. Waktu pemanasan PyPy dulu lebih besar - skrip berjalan pendek jarang berhasil menghasilkan banyak kode panas.
Veedrac
104

Situs itu tidak mengklaim PyPy adalah 6,3 kali lebih cepat dari CPython. Kutipan:

Rata-rata geometris dari semua tolok ukur adalah 0,16 atau 6,3 kali lebih cepat dari CPython

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.

spookylukey
sumber
15
Tentu saja tidak ada klaim bahwa PyPy akan menjalankan semua kode Python lebih cepat. Tetapi jika Anda mengambil semua aplikasi Python murni, saya bisa bertaruh bahwa sebagian besar dari mereka akan berjalan lebih cepat (> 3x kali) pada PyPy kemudian pada CPython.
Robert Zaremba
18
Tidak satu pun dari dua poin pertama Anda yang masuk akal. Bagaimana Anda bisa mengatakan bahwa tolok ukur mengatakan "sama sekali tidak ada tentang program Anda". Sudah cukup jelas bahwa tolok ukur bukanlah indikator yang sempurna dari semua aplikasi nyata, tetapi mereka pasti dapat berguna sebagai indikator. Saya juga tidak mengerti apa yang Anda anggap menyesatkan tentang mereka yang melaporkan rata-rata sekelompok tolok ukur. Mereka menyatakan dengan jelas bahwa itu rata-rata. Jika seorang programmer tidak mengerti apa itu rata-rata maka mereka memiliki masalah yang jauh lebih serius daripada kinerja bahasa.
Sean Geoffrey Pietz
6
@SeanGeoffreyPietz - Saya tidak mengklaim situs Pypy dengan cara apa pun menyesatkan - mereka telah mempresentasikan hasil mereka secara akurat. Tetapi pertanyaan awal salah mengutip mereka, dan menunjukkan bahwa penulis tidak memahami pentingnya kata 'rata-rata'. Banyak tolok ukur individu tidak 6,3 kali lebih cepat. Dan jika Anda menggunakan jenis rata-rata yang berbeda Anda mendapatkan nilai yang berbeda, jadi "6,3 x lebih cepat" bukan ringkasan yang memadai dari "rata-rata geometrik adalah 6,3 x lebih cepat". "Grup A adalah Z kali lebih cepat daripada grup B" terlalu samar untuk bermakna.
spookylukey
6
-1: @spookylukey Anda sepertinya menyarankan bahwa suite benchmark bias tanpa memberikan bukti untuk mendukung klaim. Kritik harus selalu didukung dengan bukti!
Evgeni Sergeev
5
@ EvgeniSergeev - tidak, saya menyiratkan bahwa semua tolok ukur bias! Tidak harus dengan sengaja, tentu saja. Ruang kemungkinan program yang berguna tidak terbatas dan sangat bervariasi, dan satu set tolok ukur hanya mengukur kinerja pada tolok ukur itu. Bertanya "seberapa cepat PyPy daripada CPython?" seperti bertanya "seberapa cepat jika Fred daripada Joe?", yang sepertinya ingin diketahui oleh OP.
spookylukey
74

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.

Tritium21
sumber
2
Menurut pypy.org/download.html , PyPy membutuhkan 4 GB RAM untuk dikompilasi (pada sistem 64-bit), bukan 8. Dan ada opsi pada halaman itu untuk melakukannya di bawah 3 GB jika diperlukan.
knite
4
@knite 1: itu baru pada 2015, dokumentasi secara historis membaca 8 GB. 2: dalam praktiknya pada tahun 2015 Anda masih membutuhkan setidaknya 8, dengan 6-7 gratis.
Tritium21
4
Persyaratan memori untuk dikompilasi tidak begitu relevan jika Anda menggunakan build atau distribusi . Mengenai "target bergerak, dan sangat eksperimental", dapatkah Anda memberikan beberapa contoh barang yang rusak? Sekali lagi, jika orang menggunakan rilis build daripada nightly build atau source, bukankah mereka memiliki harapan fungsionalitas yang wajar?
smci
@smci Ini adalah pertanyaan kuno berdasarkan data kuno, dengan jawaban kuno. Anggap pertanyaan ini dan setiap jawaban sebagai historis untuk keadaan pypy 4 tahun lalu.
Tritium21
1
@ Tritium21: Saya hanya tertarik dengan jawaban saat ini. Apa itu? Anda mungkin ingin mengedit jawaban Anda untuk mengatakan "Pada tahun 2013, membandingkan pypy vs versi 2.x dari Python adalah ..." Juga jika klaim "rata-rata geometris 6.3x" dalam pertanyaan tersebut kedaluwarsa ( seperti dari 4/2017 mereka mengklaim 7.5x, tetapi itupun tergantung pada tolok ukur ... ), maka itu perlu diedit juga (nomor versi, data terbaru, dll.) Saya pikir benchmark benchmark tidak sangat relevan, hampir tidak ada yang menjalankan raytracing dalam bahasa scripting pada CPU hari ini. Aku menemukan pybenchmarks.org
smci
36

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.

BrenBarn
sumber
17
Saya tidak berpikir C adalah bahasa yang akan pergi ke mana saja dalam waktu dekat (saya akan bersedia mengatakan, itu tidak akan hilang dalam hidup kita). sampai ada bahasa lain yang akan berjalan di mana saja, kita akan memiliki C. (perhatikan, JVM ditulis dalam C. Bahkan java, bahasa yang "berjalan kemana-mana" membutuhkan C untuk semua tempat.) Kalau tidak, saya setuju dengan posting ini pada kebanyakan poinnya.
Tritium21
7
@ Tritium21: Ya, saya hanya editorial di sana. Saya baik-baik saja dengan C yang ada, tetapi saya pikir ketergantungan Python pada C sangat merugikan, dan PyPy adalah contoh yang bagus tentang mengapa: sekarang kita memiliki kesempatan untuk mendapatkan Python yang lebih cepat, tetapi kita tersandung oleh bertahun-tahun mengandalkan C Akan jauh lebih baik bagi Python untuk berdiri dengan kedua kakinya sendiri. Bahkan tidak apa-apa jika Python ditulis dalam bahasa C, tetapi masalahnya adalah keberadaan mekanisme ekstensi yang mendorong orang untuk memperluas Python dengan cara yang bergantung pada C.
BrenBarn
4
pedang bermata dua pada itu - bagian dari apa yang membuat python begitu populer adalah kemampuannya untuk memperluas aplikasi lain dan diperluas oleh aplikasi lain. Jika Anda mengambilnya, saya tidak berpikir kita akan berbicara tentang python.
Tritium21
10
@BrenBarn Adalah kebodohan besar untuk mengklaim bahwa ketergantungan Python pada C merugikan. Tanpa C-API Python, sebagian besar perpustakaan yang sangat kuat dan interop besar yang diperoleh Python di masa remaja formatifnya (akhir 90-an), termasuk seluruh ekosistem numerik / ilmiah dan antarmuka GUI, tidak akan mungkin terjadi. Lihatlah ke sekeliling untuk mendapatkan beberapa perspektif tentang keseluruhan penggunaan Python di dunia, sebelum membuat pernyataan selimut seperti itu.
Peter Wang
4
@ PeterWang Semua pustaka tersebut dapat ditulis dengan Python, namun pustaka itu tidak secepat yang ada. Apa yang dikatakan BrenBarn adalah bahwa sekarang kita memiliki kesempatan untuk membuat python cukup cepat sehingga lib tersebut dapat ditulis dengan python tetapi kita menolak untuk mengambil kesempatan itu, karena mengambilnya berarti kehilangan kemampuan untuk menggunakan perpustakaan C. Saya percaya itulah yang dia maksud dengan merugikan, bukan bahwa keberadaan perpustakaan C adalah hal yang buruk tetapi bahwa satu-satunya cara untuk membuat perpustakaan cepat menggunakan C.
vikki
14

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.

Eric Urban
sumber
1
PyPy memiliki banyak benchmark berjalan dengan hati-hati (tidak seperti CPython sayangnya, yang tidak benar-benar memiliki suite benchmark yang menghadap pengguna saat ini). Tentu saja untuk lalu lintas jaringan, PyPy tidak dapat secara ajaib membuat sesuatu lebih cepat.
Julian
1
Julian, perlu dicatat bahwa orang-orang PyPy telah memfokuskan banyak upaya untuk meningkatkan runtime dari benchmark tertentu selama bertahun-tahun sekarang. Untuk tingkat tertentu, tampaknya mereka "overfitting" optimisasi mereka ke set tolok ukur ini dan, dalam pengalaman saya, selain dari perhitungan numerik murni (yang lebih baik di Fortran atau C99), saya tidak pernah membuat PyPy menjadi lebih dari ~ 2X lebih cepat dari CPython.
Alex Rubinsteyn
9
@AlexRubinsteyn Tapi pandangan orang-orang yang bekerja pada PyPy selalu secara umum adalah bahwa jika Anda menemukan kasus di mana PyPy lebih lambat dari CPython, dan Anda dapat mengubahnya menjadi patokan yang masuk akal, ia memiliki peluang bagus untuk ditambahkan ke suite.
gsnedders
1
Saya memeriksa blog Anda. Dalam hasil Anda, pasangan plain-python (acar, StringIO) menunjukkan bahwa pypy ~ 6.8x lebih cepat dari cpython. Saya pikir ini adalah hasil yang bermanfaat. Dalam kesimpulan Anda, Anda menunjukkan (dengan benar) bahwa kode pypy (yang merupakan python polos!) Lebih lambat dari kode C (cPickle, cStringIO), bukan kode cpython.
Caleb Hattingh
1
@gsnedders Saya telah menawarkan tolok ukur berdasarkan rinohtype pada beberapa kesempatan . Mereka belum menambahkannya ke suite.
Brecht Machiels
12

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
Jawaban ini tidak mengutip tolok ukur apa pun atau memberikan referensi.
qwr
7

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.)

Poin
sumber
17
Harus ditekankan bahwa mengandalkan __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).
3
Overhead per objek lebih tinggi dalam CPython, yang penting BANYAK setelah Anda mulai membuat banyak objek. Saya percaya PyPy melakukan ekuivalen slot secara default, untuk satu hal.
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.

Stephan Eggermont
sumber
1
Jika proyek Anda sesederhana itu, maka jelas itu tidak masalah, tetapi hal yang sama dapat dikatakan tentang implementasi bahasa apa pun: jika semua yang Anda lakukan adalah menggabungkan fungsi perpustakaan lain melalui ABI yang relatif berkinerja tinggi, maka itu semua tidak relevan.
1
Itu tidak ada hubungannya dengan sederhana. Dalam waktu rekayasa loop umpan balik penting. Terkadang jauh lebih penting daripada waktu berjalan.
Stephan Eggermont
1
Nah, Anda berbicara sangat samar (waktu rekayasa tanpa referensi untuk apa yang sedang direkayasa, apa kendalanya, dll.; Lingkaran umpan balik tanpa referensi ke apa yang diumpankan kembali kepada siapa, dll.), Jadi saya akan untuk mundur dari percakapan ini alih-alih berdagang referensi samar.
Tidak ada yang kabur di sini. Lihatlah loop OODA, atau PDCA.
Stephan Eggermont
3
@ Pengguna Nah, setiap proyek sekali berjalan yang membutuhkan waktu satu bulan untuk menulis, dan satu menit untuk menjalankan, akan memiliki kecepatan 0,0% secara keseluruhan (1 bulan + 1 menit vs 1 bulan) dari menggunakan PyPy, bahkan jika PyPy seribu kali lebih cepat. Stephan tidak mengklaim bahwa semua proyek akan memiliki kecepatan 0%.
gmatht
4

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).

Yishen Chen
sumber
16
"termasuk baterai" berarti perpustakaan standar besar , AFAIK
tshepang
4

Saya telah menemukan contoh, di mana PyPy lebih lambat dari Python. Tetapi: Hanya di Windows.

C:\Users\User>python -m timeit -n10 -s"from sympy import isprime" "isprime(2**521-1);isprime(2**1279-1)"
10 loops, best of 3: 294 msec per loop

C:\Users\User>pypy -m timeit -n10 -s"from sympy import isprime" "isprime(2**521-1);isprime(2**1279-1)"
10 loops, best of 3: 1.33 sec per loop

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):

from sympy import sieve
primes = list(sieve.primerange(1, 10**6))

Ini berjalan 10 (!) Kali lebih cepat pada PyPy daripada pada Python. Tapi tidak di windows. Itu hanya 3x lebih cepat.

Lifolofi
sumber
Menarik! Beberapa perbandingan dan angka akan lebih bagus.
ben26941
1

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 divisioncukup 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.

qwr
sumber
0

Versi Python yang didukung

Untuk mengutip Zen Python :

Jumlah keterbacaan diperhitungkan.

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.

Martin Thoma
sumber