Dużo słyszałem o projekcie PyPy . Twierdzą, że jest 6,3 razy szybszy niż interpreter CPython na ich stronie .
Ilekroć mówimy o dynamicznych językach, takich jak Python, szybkość jest jednym z najważniejszych problemów. Aby rozwiązać ten problem, mówią, że PyPy jest 6,3 razy szybszy.
Druga kwestia to równoległość, niesławna blokada globalnego tłumacza (GIL). W tym celu PyPy mówi, że może dać Python bez GIL .
Jeśli PyPy może rozwiązać te wielkie wyzwania, jakie są jego słabości, które uniemożliwiają szersze przyjęcie? To znaczy, co zapobiega kogoś takiego jak ja, typowy Python dewelopera, z włączeniem do pypy teraz ?
Odpowiedzi:
PyPy nie obsługuje numpyPyPy obsługuje teraz numpy . Niektóre rozszerzenia nadal nie są obsługiwane (Pandy, SciPy itp.). Przed wprowadzeniem zmiany zapoznaj się z listą obsługiwanych pakietów .jest obecnie eksperymentalna.właśnie osiągnął stabilny! Od 20 czerwca 2014 PyPy3 2.3.1 - Fulcrum jest już dostępny !To są główne powody, które mnie dotyczą, powiedziałbym.
źródło
np.sum(M[1:2*n**2:2, :2*n**2] * M[:2*n**2:2, :2*n**2].conjugate(), axis=1)
?) W Pythonie, co czyni Python bardzo odpowiednim dla społeczności naukowej. Dodatkowo, wykonywanie nieintensywnych części w Pythonie i odpalanie do C dla mniejszych intensywnych pętli jest powszechną i użyteczną strategią.Ta strona nie twierdzi, że PyPy jest 6,3 razy szybszy niż CPython. Cytować:
Jest to zupełnie inne oświadczenie niż złożone oświadczenie, a kiedy zrozumiesz różnicę, zrozumiesz co najmniej jeden zestaw powodów, dla których nie możesz po prostu powiedzieć „użyj PyPy”. Może to zabrzmieć jak wybieranie nitów, ale zrozumienie, dlaczego te dwa stwierdzenia są zupełnie inne, jest niezbędne.
Aby to rozbić:
Oświadczenie, które składają, dotyczy tylko stosowanych przez nich testów porównawczych. Nie mówi absolutnie nic o twoim programie (chyba że twój program jest dokładnie taki sam jak jeden z ich testów porównawczych).
Oświadczenie dotyczy średnio grupy testów porównawczych. Nie ma twierdzenia, że uruchomienie PyPy da 6,3-krotną poprawę nawet w przypadku programów, które przetestowały.
Nie ma twierdzenia, że PyPy uruchomi nawet wszystkie programy, które CPython w ogóle uruchamia , nie mówiąc już o szybszym.
źródło
Ponieważ pypy nie jest w 100% kompatybilny, wymaga skompilowania 8 gigabajtów pamięci RAM, jest ruchomym celem i jest wysoce eksperymentalny, gdy cpython jest stabilny, domyślny cel dla producentów modułów na 2 dekady (w tym rozszerzenia c, które nie działają na pypy ) i już szeroko wdrożony.
Pypy prawdopodobnie nigdy nie będzie implementacją referencyjną, ale jest to dobre narzędzie.
źródło
Drugie pytanie jest łatwiejsze do odpowiedzi: zasadniczo możesz użyć PyPy jako zamiennika drop-in, jeśli cały kod jest czystym Pythonem. Jednak wiele powszechnie używanych bibliotek (w tym niektóre biblioteki standardowe) są napisane w C i skompilowane jako rozszerzenia Pythona. Niektóre z nich mogą być przystosowane do współpracy z PyPy, niektóre nie. PyPy zapewnia to samo „skierowane do przodu” narzędzie, jak Python --- to znaczy, że jest Python --- ale jego elementy wewnętrzne są różne, więc narzędzia łączące się z tymi elementami wewnętrznymi nie będą działać.
Jeśli chodzi o pierwsze pytanie, wyobrażam sobie, że jest to coś w rodzaju Catch-22 z pierwszym: PyPy ewoluuje szybko, starając się poprawić szybkość i poprawić interoperacyjność z innym kodem. Dzięki temu jest bardziej eksperymentalny niż oficjalny.
Myślę, że możliwe jest, że jeśli PyPy przejdzie w stan stabilny, może zacząć być szerzej wykorzystywany. Myślę też, że byłoby dobrze, gdyby Python odszedł od swoich podstaw C. Ale to się nie stanie przez jakiś czas. PyPy nie osiągnął jeszcze masy krytycznej, w której jest prawie wystarczająco użyteczny, aby zrobić wszystko, co chcesz, co zmotywuje ludzi do uzupełnienia braków.
źródło
Zrobiłem mały test porównawczy na ten temat. Podczas gdy wiele innych plakatów mówiło dobrze o kompatybilności, z mojego doświadczenia wynika, że PyPy nie jest o wiele szybszy do poruszania się po bitach. W przypadku wielu zastosowań Pythona istnieje tylko translacja bitów między dwiema lub więcej usługami. Na przykład niewiele aplikacji internetowych wykonuje intensywną analizę procesora zbiorów danych. Zamiast tego pobierają bajty od klienta, przechowują je w jakiejś bazie danych, a następnie zwracają je innym klientom. Czasami format danych ulega zmianie.
Deweloperzy BDFL i CPython są niezwykle inteligentną grupą ludzi i udało im się pomóc CPython osiągnąć doskonałe wyniki w takim scenariuszu. Oto bezwstydna wtyczka do blogu: http://www.hydrogen18.com/blog/unpickling-buffers.html . Używam Stackless, który pochodzi z CPython i zachowuje pełny interfejs modułu C. W tym przypadku nie znalazłem żadnej korzyści z używania PyPy.
źródło
P: Jeśli PyPy może rozwiązać te wielkie wyzwania (szybkość, zużycie pamięci, równoległość) w porównaniu do CPython, jakie są jego słabości, które uniemożliwiają szersze zastosowanie?
Odp .: Po pierwsze, niewiele jest dowodów na to, że zespół PyPy może ogólnie rozwiązać problem prędkości . Długoterminowe dowody wskazują, że PyPy uruchamia niektóre kody Pythona wolniej niż CPython i ta wada wydaje się być głęboko zakorzeniona w PyPy.
Po drugie, obecna wersja PyPy zużywa znacznie więcej pamięci niż CPython w dość dużym zestawie przypadków. PyPy nie rozwiązał jeszcze problemu zużycia pamięci.
To, czy PyPy rozwiąże wspomniane wielkie wyzwania i będzie generalnie szybsze, mniej wymagające pamięci i bardziej przyjazne dla paralelizmu niż CPython, jest kwestią otwartą, której nie można rozwiązać w krótkim okresie. Niektóre osoby obstawiają, że PyPy nigdy nie będzie w stanie zaoferować ogólnego rozwiązania umożliwiającego zdominowanie CPython 2.7 i 3.3 we wszystkich przypadkach.
Jeśli PyPy odniesie lepszy wynik niż CPython w ogóle, co jest wątpliwe, główną słabością wpływającą na jego szersze zastosowanie będzie jego kompatybilność z CPython. Istnieją również problemy, takie jak fakt, że CPython działa na szerszej gamie procesorów i systemów operacyjnych, ale problemy te są znacznie mniej ważne w porównaniu do wydajności PyPy i celów kompatybilności CPython.
P: Dlaczego nie mogę teraz zastąpić CPython PyPy?
Odp .: PyPy nie jest w 100% kompatybilny z CPython, ponieważ nie symuluje CPython pod maską. Niektóre programy mogą nadal zależeć od unikalnych funkcji CPython, których nie ma w PyPy, takich jak powiązania C, implementacje C obiektu i metod Pythona lub przyrostowy charakter modułu śmieciowego CPython.
źródło
CPython ma liczenie referencji i odśmiecanie, PyPy ma tylko odśmiecanie.
Tak więc obiekty są zwykle usuwane wcześniej i
__del__
są wywoływane w bardziej przewidywalny sposób w CPython. Niektóre oprogramowanie polega na tym zachowaniu, dlatego nie są gotowe do migracji do PyPy.Niektóre inne oprogramowanie działa z oboma, ale zużywa mniej pamięci z CPython, ponieważ nieużywane obiekty są wcześniej zwalniane. (Nie mam żadnych pomiarów wskazujących, jak ważne jest to i jakie inne szczegóły implementacji wpływają na użycie pamięci).
źródło
__del__
wcześniejszym wezwaniu lub w ogóle jest błędne nawet w CPython. Jak to ująłeś, zwykle działa, a niektórzy uważają to za gwarantowane. Jeśli cokolwiek, co odnosi się do obiektu, zostanie uwięzione w cyklu odniesienia (co jest raczej łatwe - czy wiesz, że sprawdzenie bieżącego wyjątku w pewien nieskomplikowany sposób tworzy cykl odniesienia?) Finalizacja jest opóźniana w nieskończoność, aż do następnego cyklu GC (co może nigdy nie być ). Jeśli sam obiekt jest częścią cyklu odniesienia,__del__
nie będzie w ogóle wywoływany (przed Python 3.4).W przypadku wielu projektów różnica prędkości między pytonami wynosi 0%. To są te, które są zdominowane przez czas inżynierii i gdzie wszystkie pytony mają taką samą obsługę bibliotek.
źródło
Upraszczając: PyPy zapewnia szybkość, której brakuje CPython, ale poświęca jego kompatybilność. Większość ludzi wybiera jednak Pythona ze względu na jego elastyczność i funkcję „baterii” (wysoka kompatybilność), a nie ze względu na szybkość (choć nadal jest preferowana).
źródło
Znalazłem przykłady, w których PyPy działa wolniej niż Python. Ale: tylko w systemie Windows.
Jeśli więc myślisz o PyPy, zapomnij o systemie Windows. W systemie Linux możesz osiągnąć niesamowite przyspieszenia. Przykład (podaj wszystkie liczby pierwsze od 1 do 1 000 000):
Działa to 10 (!) Razy szybciej na PyPy niż na Pythonie. Ale nie w systemie Windows. Tam jest tylko 3 razy szybszy.
źródło
PyPy już od jakiegoś czasu obsługuje Python 3, ale zgodnie z tym postem HackerNoon autorstwa Anthony'ego Shawa z 2 kwietnia 2018 r. PyPy3 jest wciąż kilka razy wolniejszy niż PyPy (Python 2).
W przypadku wielu obliczeń naukowych, zwłaszcza obliczeń macierzowych, lepszym wyborem jest numpy (patrz FAQ: Czy powinienem instalować numpy czy numpypy? ).
Pypy nie obsługuje gmpy2. Zamiast tego możesz skorzystać z gmpy_cffi, chociaż nie przetestowałem jego prędkości, a projekt miał jedną wersję w 2014 roku.
W przypadku problemów z Project Euler często używam PyPy, a do prostych obliczeń numerycznych często
from __future__ import division
wystarcza do moich celów, ale obsługa Python 3 jest wciąż rozwijana od 2018 r., A najlepszym rozwiązaniem jest 64-bitowy Linux. Windows PyPy3.5 v6.0, najnowszy z grudnia 2018 r., Jest w wersji beta.źródło
Obsługiwane wersje Pythona
Aby zacytować Zen Pythona :
Na przykład Python 3.7 wprowadził klasy danych, a Python 3.8 wprowadził fstring = .
W Pythonie 3.7 i Pythonie 3.8 mogą znajdować się inne funkcje, które są dla Ciebie ważniejsze. Chodzi o to, że PyPy nie obsługuje obecnie Python 3.7 lub Python 3.8.
źródło