Ohjelmointi

Mikä on PyPy? Nopeampi Python ilman kipua

Python on ansainnut maineensa voimakkaana, joustavana ja helppona työskennellä. Nämä hyveet ovat johtaneet sen käyttöön valtavassa ja kasvavassa valikoimassa sovelluksia, työnkulkuja ja kenttiä. Mutta kielen muotoilu - sen tulkittu luonne, ajonaikainen dynamiikka - tarkoittaa, että Python on aina ollut suuruusluokkaa hitaampi kuin konekieliset kielet, kuten C tai C ++.

Vuosien mittaan kehittäjät ovat keksineet erilaisia ​​ratkaisuja Pythonin nopeusrajoituksiin. Voit esimerkiksi kirjoittaa suorituskykyä vaativia tehtäviä C: hen ja kääriä ne Pythonilla; monet koneoppimiskirjastot tekevät juuri tämän. Tai voit käyttää Cythonia, projektia, jonka avulla voit ripotella Python-koodia ajonaikaisilla tiedoilla, joiden avulla se voidaan kääntää C: hen.

Mutta kiertotavat eivät ole koskaan ihanteellisia. Eikö olisi hienoa, jos voisimme vain ottaa olemassa olevan Python-ohjelmankuten onja ajaa se dramaattisesti nopeammin? Juuri sen PyPy antaa sinun tehdä.

Aiheeseen liittyvä video: PyPy-ajonaikaisen käyttö Pythonille

PyPy vs. CPython

PyPy on drop-in-korvaus Python-tulkin, CPythonin kanssa. Kun CPython kääntää Pythonin välitavutavakoodiksi, jonka virtuaalikone sitten tulkitsee, PyPy kääntää JIT-käännöksen Python-koodin koneen syntyperäiselle kokoonpanokielelle.

Suorituskyvyn kasvu voi olla dramaattista suoritettavasta tehtävästä riippuen. PyPy nopeuttaa keskimäärin Pythonia noin 7,6 kertaa, ja jotkut tehtävät nopeutuvat vähintään 50 kertaa. CPython-tulkki ei yksinkertaisesti suorita samanlaisia ​​optimointeja kuin PyPy, eikä todennäköisesti koskaan, koska se ei ole yksi sen suunnittelutavoitteista.

Parasta on, että kehittäjä ei vaadi vain vähän tai ei lainkaan vaivaa PyPyn tarjoamien hyötyjen avaamiseksi. Vaihda vain CPython PyPy-tiedostoon, ja pääosin olet valmis. On joitain poikkeuksia, joista keskustellaan jäljempänä, mutta PyPyn ilmoitettu tavoite on suorittaa olemassa oleva, muokkaamaton Python-koodi ja tarjota sille automaattinen nopeuden lisäys.

PyPy tukee tällä hetkellä sekä Python 2: ta että Python 3: ta projektin eri inkarnaatioiden kautta. Toisin sanoen sinun on ladattava eri PyPy-versiot käyttämästäsi Python-versiosta riippuen. PyPyn Python 2 -haara on ollut paljon pidempi, mutta Python 3 -versio on saatettu vauhtiin myöhään. Se tukee tällä hetkellä sekä Python 3.5 (tuotannon laatu) että Python 3.6 (beeta laatu).

PyPy tukee kaikkien Python-ydinkielien lisäksi myös suurinta osaa Python-ekosysteemin työkaluista, kutenpip pakkaamiseen taivirtualenv virtuaalisiin ympäristöihin. Suurimman osan Python-paketeista, jopa C-moduuleilla, pitäisi toimia sellaisenaan, vaikka jäljempänä on rajoituksia.

Kuinka PyPy toimii

PyPy käyttää optimointitekniikoita, jotka löytyvät muista juuri oikeaan aikaan-kääntäjistä dynaamisille kielille. Se analysoi käynnissä olevia Python-ohjelmia määrittääkseen objektien tyyppitiedot, kun ne on luotu ja käytetty ohjelmissa, ja käyttää sitten kyseisiä tyyppitietoja oppaana nopeuttamaan asioita. Esimerkiksi, jos Python-toiminto toimii vain yhden tai kahden eri objektityypin kanssa, PyPy luo konekoodin näiden erityistapausten käsittelemiseksi.

PyPyn optimoinnit käsitellään automaattisesti ajon aikana, joten sinun ei yleensä tarvitse säätää sen suorituskykyä. Edistynyt käyttäjä voi kokeilla PyPyn komentorivivaihtoehtoja nopeamman koodin luomiseksi erikoistapauksia varten, mutta vain harvoin tämä on välttämätöntä.

PyPy poikkeaa myös tavasta, jolla CPython käsittelee joitain sisäisiä toimintoja, mutta yrittää säilyttää yhteensopivan käyttäytymisen. Esimerkiksi PyPy käsittelee roskien keruuta eri tavalla kuin CPython. Kaikkia objekteja ei kerätä heti, kun ne ovat ulottumattomissa, joten PyPy-ohjelmassa käynnissä oleva Python-ohjelma saattaa näyttää suuremman muistinjäljen kuin CPython-ohjelmassa. Mutta voit silti käyttää Pythonin korkean tason roskakorinkontrollia, joka on paljastettu gc moduuli, kuten gc.enable (), gc.disable ()ja gc.collect ().

Jos haluat tietoja PyPyn JIT-toiminnasta ajon aikana, PyPy sisältää moduulin, pypyjit, joka paljastaa monia JIT-koukkuja Python-sovelluksellesi. Jos sinulla on toiminto tai moduuli, joka näyttää toimivan huonosti JIT: n kanssa, pypyjit avulla voit saada siitä yksityiskohtaisia ​​tilastoja.

Toinen PyPy-kohtainen moduuli, __pypy__, paljastaa muita PyPy-ominaisuuteen liittyviä ominaisuuksia, joten siitä voi olla hyötyä kirjoitettaessa sovelluksia, jotka hyödyntävät näitä ominaisuuksia. Pythonin ajonaikaisen dynamiikan vuoksi on mahdollista rakentaa Python-sovelluksia, jotka käyttävät näitä ominaisuuksia, kun PyPy on läsnä, ja jättää ne huomiotta, kun sitä ei ole.

PyPy-rajoitukset

Maaginen kuin PyPy saattaa tuntua, se ei ole taikaa. PyPy: llä on tiettyjä rajoituksia, jotka heikentävät tai estävät sen tehokkuuden tietyntyyppisissä ohjelmissa. Valitettavasti PyPy ei ole täysin universaali korvike osakekohtaiselle CPython-ajonaikalle.

PyPy toimii parhaiten puhtaiden Python-sovellusten kanssa

PyPy on aina toiminut parhaiten ”puhtaiden” Python-sovellusten kanssa - ts. Pythonissa kirjoitettujen sovellusten eikä minkään muun kanssa. Python-paketit, jotka ovat yhteydessä C-kirjastoihin, kuten NumPy, eivät ole menestyneet yhtä hyvin, koska PyPy jäljittelee CPythonin natiiveja binaarisia rajapintoja.

PyPyn kehittäjät ovat hämmentäneet tätä ongelmaa ja tehneet PyPystä yhteensopivamman useimpien C-laajennuksista riippuvien Python-pakettien kanssa. Esimerkiksi Numpy toimii nyt hyvin PyPyn kanssa. Mutta jos haluat parhaan yhteensopivuuden C-laajennusten kanssa, käytä CPythonia.

PyPy toimii parhaiten pidempään käynnissä olevien ohjelmien kanssa

Yksi sivuvaikutuksista siitä, miten PyPy optimoi Python-ohjelmia, on se, että pidemmät ohjelmat hyötyvät eniten sen optimoinnista. Mitä pidempään ohjelma toimii, sitä enemmän ajoaikatyyppitietoja PyPy voi kerätä ja sitä enemmän optimointeja se voi tehdä. Yksittäiset Python-skriptit eivät hyödy tällaisista asioista. Hyödyllisissä sovelluksissa on tyypillisesti silmukoita, jotka toimivat pitkiä aikoja tai jatkuvat jatkuvasti taustalla - esimerkiksi verkkokehykset.

PyPy ei tee kokoamista etukäteen

PyPykokoaa Python-koodi, mutta se ei olekääntäjä Python-koodille. Koska PyPy suorittaa optimointinsa ja Pythonin luontaisen dynaamisuuden, tuloksena olevaa JITted-koodia ei voida lähettää itsenäisenä binaarina ja käyttää sitä uudelleen. Jokainen ohjelma on koottava kullekin ajolle. Jos haluat kääntää Pythonin nopeampaan koodiin, joka voi toimia erillisenä sovelluksena, käytä Cythonia, Numbaa tai parhaillaan kokeilevaa Nuitka-projektia.