Programiranje

Kaj je PyPy? Hitrejši Python brez bolečin

Python si je prislužil sloves zmogljivega, prilagodljivega in enostavnega dela z njim. Te vrline so privedle do njegove uporabe v široki in vse večji vrsti aplikacij, delovnih tokov in polj. Toda zasnova jezika - njegova interpretirana narava, dinamičnost izvajanja - pomeni, da je bil Python vedno red veliko počasnejši od domačih jezikov, kot sta C ali C ++.

Z leti so razvijalci pripravili različne rešitve za omejitve hitrosti Pythona. Na primer, v C lahko napišete naloge, ki zahtevajo veliko uspešnosti, in jih zavijete s Pythonom; številne knjižnice strojnega učenja delajo točno to. Lahko pa uporabite Cython, projekt, ki vam omogoča, da kodo Python potresete s podatki o vrsti izvajanja, ki omogočajo njeno prevajanje v C.

Toda rešitve nikoli niso idealne. Ali ne bi bilo super, če bi lahko vzeli samo obstoječi program Pythonkot je, in ga zagnati dramatično hitreje? Natanko to vam omogoča PyPy.

Sorodni video: Uporaba izvajalnega okolja PyPy za Python

PyPy proti CPython

PyPy je nadomestna zamenjava za osnovni tolmač Python, CPython. Medtem ko CPython Python prevede v vmesno bajtno kodo, ki jo nato interpretira navidezni stroj, PyPy za prevajanje kode Pythona v strojni izvorni montažni jezik uporablja ravno pravočasno (JIT) kompilacijo.

Glede na nalogo, ki jo opravljamo, je lahko povečanje učinkovitosti dramatično. V povprečju PyPy Python pospeši približno 7,6-krat, nekatere naloge pa pospešijo 50-krat ali več. Tolmač CPython preprosto ne izvaja enakih vrst optimizacij kot PyPy in verjetno nikoli ne bo, saj to ni eden od njegovih ciljev oblikovanja.

Najboljše je, da razvijalec zahteva malo ali nič truda, da bi izkoristil dobičke, ki jih ponuja PyPy. Preprosto zamenjajte CPython za PyPy in večinoma ste končali. Obstaja nekaj izjem, o katerih bomo razpravljali spodaj, vendar je cilj PyPy-ja zagnati obstoječo, nespremenjeno kodo Pythona in ji zagotoviti samodejno povečanje hitrosti.

PyPy trenutno podpira Python 2 in Python 3 zaradi različnih inkarnacij projekta. Z drugimi besedami, prenesti morate različne različice PyPy, odvisno od različice Pythona, ki jo boste uporabljali. Podružnica Python 2 PyPy obstaja že veliko dlje, vendar je bila različica Python 3 pozno posodobljena. Trenutno podpira Python 3.5 (kakovost proizvodnje) in Python 3.6 (kakovost beta).

Poleg tega, da podpira celotno jedro jezika Python, PyPy deluje z veliko večino orodij v ekosistemu Python, kot jepip za embalažo ozvirtualenv za navidezna okolja. Večina paketov Python, tudi tisti z moduli C, bi morala delovati, kot je, čeprav obstajajo omejitve, o katerih bomo govorili spodaj.

Kako deluje PyPy

PyPy uporablja tehnike optimizacije, ki jih najdemo v drugih pravočasnih prevajalnikih za dinamične jezike. Analizira zagnane programe Python, da določi informacije o tipu predmetov, kot so ustvarjeni in uporabljeni v programih, nato pa te informacije uporabi kot vodilo za pospešitev stvari. Če na primer funkcija Python deluje samo z eno ali dvema različnima vrstama predmetov, PyPy ustvari strojno kodo za obravnavo teh posebnih primerov.

Optimizacije PyPy se med izvajanjem izvajajo samodejno, zato na splošno ni treba spreminjati njegove zmogljivosti. Napreden uporabnik lahko eksperimentira z možnostmi ukazne vrstice PyPy, da ustvari hitrejšo kodo za posebne primere, vendar je le redko to potrebno.

PyPy odstopa tudi od načina, kako CPython obravnava nekatere notranje funkcije, vendar poskuša ohraniti združljivo vedenje. Na primer, PyPy ravna z zbiranjem smeti drugače kot CPython. Ko izpadejo izven obsega, se vsi predmeti ne zberejo takoj, zato lahko program Python, ki se izvaja pod PyPy, pokaže večji odtis pomnilnika kot pri izvajanju pod CPython. Lahko pa še vedno uporabljate Pythonove kontrole za zbiranje smeti na visoki ravni, ki so izpostavljene prek gc modul, kot je gc.enable (), gc.disable (), in gc.collect ().

Če želite informacije o PyPyjevem vedenju JIT med izvajanjem, PyPy vključuje modul, pypyjit, ki izpostavi veliko kavljev JIT vaši aplikaciji Python. Če imate funkcijo ali modul, ki z JIT-om deluje slabo, pypyjit vam omogoča pridobitev podrobnih statističnih podatkov o tem.

Še en modul, specifičen za PyPy, __pypy__, izpostavlja druge funkcije, značilne za PyPy, zato je lahko koristno za pisanje aplikacij, ki te funkcije uporabljajo. Zaradi dinamične dinamike Pythona je mogoče ustvariti aplikacije Python, ki uporabljajo te funkcije, ko je PyPy prisoten, in jih prezre, kadar ni.

Omejitve PyPy

Čarobno, kot se zdi PyPy, ni magija. PyPy ima določene omejitve, ki zmanjšujejo ali preprečujejo njegovo učinkovitost za nekatere vrste programov. Žal PyPy ni povsem univerzalna zamenjava za zaloge CPython.

PyPy najbolje deluje s čisto Pythonovimi aplikacijami

PyPy se je vedno najbolje obnašal pri "čistih" aplikacijah Python - torej aplikacijah, napisanih v Pythonu, in nič drugega. Paketi Python, ki se povezujejo s knjižnicami C, kot je NumPy, se prav tako niso odrezali zaradi načina, kako PyPy posnema domače binarne vmesnike CPythona.

Razvijalci PyPy so se izognili tej težavi in ​​jo naredili bolj združljivo z večino paketov Python, ki so odvisni od razširitev C. Numpy, na primer, zdaj zelo dobro deluje s PyPy. Če pa želite maksimalno združljivost z razširitvami C, uporabite CPython.

PyPy najbolje deluje z dolgotrajnimi programi

Eden od stranskih učinkov, kako PyPy optimizira programe Python, je, da imajo dolgotrajnejši programi največ koristi od njegovih optimizacij. Dlje kot se program izvaja, več informacij o času izvajanja lahko zbere PyPy in več optimizacij lahko naredi. Enkrat narejeni skripti Python tovrstnim stvarem ne bodo koristili. Aplikacije, ki koristijo, imajo običajno zanke, ki se izvajajo dlje časa ali pa se neprekinjeno izvajajo v ozadju - na primer spletni okviri.

PyPy ne dela predčasnega prevajanja

PyPysestavlja Koda Python, vendar niprevajalnik za kodo Python. Zaradi načina, na katerega PyPy izvaja svoje optimizacije in inherentne dinamičnosti Pythona, ni mogoče oddati nastale kode JITted kot samostojno binarno datoteko in jo ponovno uporabiti. Vsak program je treba sestaviti za vsak zagon. Če želite Python zbrati v hitrejšo kodo, ki se lahko izvaja kot samostojna aplikacija, uporabite Cython, Numba ali trenutno eksperimentalni projekt Nuitka.

$config[zx-auto] not found$config[zx-overlay] not found