Programmēšana

Kas ir PyPy? Ātrāks Python bez sāpēm

Python ir izpelnījies reputāciju kā spēcīgs, elastīgs un ar to viegli strādāt. Šie tikumi ir noveduši pie tā, ka tas tiek izmantots milzīgā un pieaugošā lietojumu, darbplūsmu un lauku daudzveidībā. Bet valodas dizains - tā interpretētais raksturs, izpildlaika dinamika - nozīmē, ka Python vienmēr ir bijis pakāpes lēnāks nekā mašīndzimtās valodas, piemēram, C vai C ++.

Gadu gaitā izstrādātāji ir izstrādājuši dažādus risinājumus Python ātruma ierobežojumiem. Piemēram, jūs varētu rakstīt darbietilpīgus uzdevumus C un ietīt to ar Python; daudzas mašīnmācīšanās bibliotēkas dara tieši to. Vai arī jūs varētu izmantot projektu Cython, kas ļauj jums apkaisīt Python kodu ar izpildlaika tipa informāciju, kas ļauj to apkopot C.

Bet risinājumi nekad nav ideāli. Vai nebūtu lieliski, ja mēs varētu vienkārši paņemt esošu Python programmukā irun palaist to dramatiski ātrāk? Tas ir tieši tas, ko PyPy ļauj jums darīt.

Saistītais video: PyPy izpildlaika izmantošana Python

PyPy pret CPython

PyPy ir pilienu tulka CPython nomaiņa. Kamēr CPython kompilē Python starpposma baitkodā, kuru pēc tam interpretē virtuālā mašīna, PyPy izmanto tieši laikā veiktu (JIT) kompilāciju, lai tulkot Python kodu mašīnā dzimtā montāžas valodā.

Atkarībā no veicamā uzdevuma snieguma pieaugums var būt dramatisks. Vidēji PyPy paātrina Python apmēram 7,6 reizes, un daži uzdevumi tiek paātrināti 50 vai vairāk reizes. CPython tulks vienkārši neveic tāda paša veida optimizācijas kā PyPy un, iespējams, nekad to nedarīs, jo tas nav viens no tā dizaina mērķiem.

Labākā daļa ir tāda, ka izstrādātājs neprasa mazas pūles, lai tās varētu gūt PyPy. Vienkārši nomainiet CPython pret PyPy, un lielākoties esat pabeidzis. Ir daži izņēmumi, kas aplūkoti turpmāk, taču PyPy noteiktais mērķis ir palaist esošu, nemodificētu Python kodu un nodrošināt tam automātisku ātruma palielināšanu.

Pašlaik PyPy atbalsta gan Python 2, gan Python 3, izmantojot dažādus projekta iemiesojumus. Citiem vārdiem sakot, jums ir jālejupielādē dažādas PyPy versijas atkarībā no izmantotās Python versijas. PyPy Python 2 filiāle ir bijusi daudz ilgāka, taču Python 3 versija ir paātrināta jau vēlāk. Pašlaik tas atbalsta gan Python 3.5 (ražošanas kvalitāte), gan Python 3.6 (beta kvalitāte).

Papildus tam, ka tiek atbalstīta visa pamata Python valoda, PyPy darbojas ar lielāko daļu rīku Python ekosistēmā, piemēram,pip iesaiņošanai vaivirtualenv virtuālajām vidēm. Lielākajai daļai Python pakotņu, pat tām, kurām ir C moduļi, vajadzētu darboties kā ir, lai gan ir ierobežojumi, kurus mēs aplūkosim tālāk.

Kā darbojas PyPy

PyPy izmanto optimizācijas paņēmienus, kas atrodami citos tieši savlaicīgi sastādītājos dinamiskām valodām. Tas analizē darbojošās Python programmas, lai noteiktu objektu tipa informāciju, kā tie ir izveidoti un izmantoti programmās, un pēc tam izmanto šī tipa informāciju kā ceļvedi, lai paātrinātu lietas. Piemēram, ja Python funkcija darbojas tikai ar vienu vai diviem dažādiem objektu tipiem, PyPy ģenerē mašīnas kodu, lai apstrādātu šos īpašos gadījumus.

PyPy optimizācija tiek izpildīta automātiski izpildlaika laikā, tāpēc jums parasti nav jāpielāgo tā veiktspēja. Pieredzējis lietotājs var eksperimentēt ar PyPy komandrindas opcijām, lai ģenerētu ātrāku kodu īpašiem gadījumiem, taču tas ir nepieciešams tikai reti.

PyPy arī atkāpjas no tā, kā CPython apstrādā dažas iekšējās funkcijas, taču mēģina saglabāt saderīgu uzvedību. Piemēram, PyPy ar atkritumu savākšanu rīkojas savādāk nekā CPython. Ne visi objekti tiek nekavējoties savākti, tiklīdz tie ir izgājuši no darbības jomas, tāpēc Python programmā palaistā Python programma var parādīt lielāku atmiņas nospiedumu nekā tad, kad darbojas ar CPython. Bet jūs joprojām varat izmantot Python augsta līmeņa atkritumu savākšanas vadīklas, kas pakļautas caur gc modulis, piemēram, gc.enable (), gc.disable (), un gc.collect ().

Ja vēlaties saņemt informāciju par PyPy JIT darbību izpildes laikā, PyPy ietver moduli, pypyjit, kas daudziem JIT āķiem pakļauj jūsu Python lietojumprogrammu. Ja jums ir funkcija vai modulis, kas, šķiet, darbojas slikti ar JIT, pypyjit ļauj iegūt detalizētu statistiku par to.

Vēl viens PyPy modulis, __pypy__, atklāj citas PyPy specifiskas funkcijas, tāpēc tas var būt noderīgs, rakstot lietotnes, kas izmanto šīs funkcijas. Python izpildlaika dinamisma dēļ ir iespējams izveidot Python lietotnes, kas izmanto šīs funkcijas, kad PyPy ir klāt, un tās ignorē, ja tā nav.

PyPy ierobežojumi

Cik maģiski varētu šķist PyPy, tā nav maģija. PyPy ir noteikti ierobežojumi, kas samazina vai novērš tā efektivitāti noteikta veida programmās. Ak, PyPy nav pilnīgi universāls akciju CPython izpildlaika aizstājējs.

PyPy vislabāk darbojas ar tīrām Python lietotnēm

PyPy vienmēr vislabāk ir darbojies ar “tīrām” Python lietojumprogrammām - t.i., ar Python rakstītām lietojumprogrammām un neko citu. Python pakotnēm, kas saskaras ar C bibliotēkām, piemēram, NumPy, nav veicies tikpat labi, kā PyPy atdarina CPython vietējās binārās saskarnes.

PyPy izstrādātāji ir atmetuši šo jautājumu un padarījuši PyPy savietojamāku ar lielāko daļu Python pakotņu, kas ir atkarīgas no C paplašinājumiem. Piemēram, Numpy tagad ļoti labi strādā ar PyPy. Bet, ja vēlaties maksimālu saderību ar C paplašinājumiem, izmantojiet CPython.

PyPy vislabāk darbojas ar ilgāk darbināmām programmām

Viena no blakusparādībām, kā PyPy optimizē Python programmas, ir tā, ka ilgāk darbojošās programmas visvairāk gūst labumu no tās optimizācijas. Jo ilgāk programma darbojas, jo vairāk darbības laika veida PyPy var apkopot un jo vairāk optimizācijas tā var veikt. Vienreizējie Python skripti negūs labumu no šāda veida lietām. Lietojumprogrammām, kas gūst labumu, parasti ir cilpas, kas darbojas ilgu laiku vai nepārtraukti darbojas fonā, piemēram, tīmekļa ietvari.

PyPy neveic apkopošanu pirms laika

PyPyapkopo Python kods, bet tas tā navsastādītājs par Python kodu. Tā kā PyPy veic optimizāciju un raksturīgo Python dinamiku, nav iespējams izlaist iegūto JITted kodu kā atsevišķu bināru failu un to atkārtoti izmantot. Katra programma ir jāapkopo katram braucienam. Ja vēlaties apkopot Python ātrākā kodā, kas var darboties kā atsevišķa lietotne, izmantojiet Cython, Numba vai pašlaik eksperimentālo Nuitka projektu.

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