Programovanie

Čo je to PyPy? Rýchlejší Python bez bolesti

Python si získal reputáciu vďaka svojej výkonnosti, flexibilite a ľahkej práci s ním. Tieto prednosti viedli k jeho použitiu v obrovskej a rastúcej škále aplikácií, pracovných tokov a polí. Dizajn jazyka - jeho interpretovaná povaha a dynamika behu - však znamená, že Python bol vždy o rádovo pomalší ako strojovo natívne jazyky ako C alebo C ++.

V priebehu rokov prišli vývojári s rôznymi riešeniami obmedzenia rýchlosti Pythonu. Napríklad by ste mohli písať úlohy náročné na výkon v C a zabaliť ich do Pythonu; veľa knižníc strojového učenia robí presne toto. Alebo môžete použiť Cython, projekt, ktorý vám umožní posypať kód Pythonu informáciami o type runtime, ktorý umožňuje jeho kompiláciu do C.

Riešenia však nikdy nie sú ideálne. Nebolo by skvelé, keby sme si mohli vziať iba existujúci program v jazyku Pythonako je, a spustiť to dramaticky rýchlejšie? To je presne to, čo vám umožňuje PyPy.

Súvisiace video: Používanie runtime PyPy pre Python

PyPy vs. CPython

PyPy je náhradná náhrada za tlmočník akciového Pythonu, CPython. Zatiaľ čo CPython kompiluje Python do sprostredkovaného bajtkódu, ktorý je potom interpretovaný virtuálnym strojom, PyPy používa kompiláciu just-in-time (JIT) na preloženie kódu Pythonu do strojovo natívneho montážneho jazyka.

V závislosti od vykonávanej úlohy môžu byť prírastky výkonu dramatické. V priemere PyPy zrýchľuje Python asi 7,6-krát, pričom niektoré úlohy boli zrýchlené 50-krát a viac. Tlmočník CPython jednoducho nevykonáva rovnaké druhy optimalizácií ako PyPy a pravdepodobne to nikdy neurobí, pretože to nie je jedným z jeho dizajnových cieľov.

Najlepšie na tom je, že vývojár potrebuje len malé alebo žiadne úsilie na odblokovanie ziskov, ktoré PyPy poskytuje. Jednoducho vymeňte CPython za PyPy a z väčšej časti ste hotoví. Existuje niekoľko výnimiek, ktoré sú diskutované nižšie, ale stanoveným cieľom PyPy je spustiť existujúci nemodifikovaný kód Pythonu a poskytnúť mu automatické zvýšenie rýchlosti.

PyPy v súčasnosti podporuje Python 2 aj Python 3, a to prostredníctvom rôznych vtelení projektu. Inými slovami, musíte si stiahnuť rôzne verzie PyPy v závislosti od verzie Pythonu, ktorú budete používať. Pobočka PyPonu 2 PyPy je tu oveľa dlhšie, ale verzia Pythonu 3 bola neskoro vyťažená. Momentálne podporuje Python 3.5 (kvalita výroby) aj Python 3.6 (kvalita beta).

Okrem podpory všetkých základných jazykov Python, PyPy pracuje s prevažnou väčšinou nástrojov v ekosystéme Python, ako sú napr.pip na balenie prípvirtualenv pre virtuálne prostredia. Väčšina balíkov Python, dokonca aj balíkov s modulmi C, by mala fungovať tak, ako sú, aj keď existujú určité obmedzenia, ktoré si priblížime nižšie.

Ako funguje PyPy

PyPy používa optimalizačné techniky nájdené v iných kompilátoroch just-in-time pre dynamické jazyky. Analyzuje spustené programy Python, aby zistil typové informácie o objektoch tak, ako sú vytvárané a používané v programoch, a potom tieto informácie o type použije ako pomôcku na zrýchlenie. Napríklad, ak funkcia Pythonu pracuje iba s jedným alebo dvoma rôznymi typmi objektov, PyPy vygeneruje strojový kód na spracovanie týchto konkrétnych prípadov.

Optimalizácie PyPy sa spracúvajú automaticky za behu, takže vo všeobecnosti nie je potrebné vylepšovať ich výkon. Pokročilý používateľ môže experimentovať s možnosťami príkazového riadku PyPy na generovanie rýchlejšieho kódu pre špeciálne prípady, je to však potrebné len zriedka.

PyPy sa tiež odkláňa od spôsobu, akým CPython spracováva niektoré interné funkcie, ale snaží sa zachovať kompatibilné správanie. Napríklad PyPy spracováva odvoz odpadu inak ako CPython. Nie všetky objekty sa zhromaždia okamžite, keď vyjdú z rozsahu, takže program Python bežiaci pod PyPy môže vykazovať väčšiu pamäťovú stopu ako pri spustení pod CPython. Stále však môžete použiť ovládacie prvky na vysokej úrovni na zhromažďovanie odpadu v Pythone vystavené prostredníctvom gc modul, ako napr gc.enable (), gc.disable ()a gc.collect ().

Ak chcete informácie o správaní JIT PyPy za behu, PyPy obsahuje modul, pypyjit, ktorý odhaľuje mnoho spojení JIT s vašou aplikáciou Python. Ak máte funkciu alebo modul, ktorý má, zdá sa, slabý výkon s JIT, pypyjit vám umožňuje získať o ňom podrobné štatistiky.

Ďalší modul špecifický pre PyPy, __pypy__, vystavuje ďalšie funkcie špecifické pre PyPy, takže môže byť užitočné pri písaní aplikácií, ktoré tieto funkcie využívajú. Kvôli dynamike runtime modulu Python je možné zostaviť aplikácie v jazyku Python, ktoré používajú tieto funkcie, ak je prítomný PyPy, a ignoruje ich, ak nie sú.

Obmedzenia PyPy

Čarovné, ako by sa PyPy mohlo zdať, nie je to kúzlo. Program PyPy má určité obmedzenia, ktoré znižujú alebo bránia jeho účinnosti pre určité druhy programov. Bohužiaľ, PyPy nie je úplne univerzálnou náhradou za bežný runtime CPython.

PyPy funguje najlepšie s čistými aplikáciami Python

PyPy vždy fungoval najlepšie s „čistými“ aplikáciami v Pythone - t. J. S aplikáciami napísanými v Pythone a ničím iným. Balíky Pythonu, ktoré sú prepojené s knižnicami C, ako je napríklad NumPy, sa zatiaľ príliš nevydarili kvôli spôsobu, akým PyPy emuluje natívne binárne rozhrania CPythonu.

Vývojári PyPy sa nad týmto problémom pozastavili a PyPy sa stali kompatibilnejšími s väčšinou balíkov Pythonu, ktoré závisia od rozšírení C. Napríklad Numpy teraz funguje veľmi dobre s PyPy. Ak však chcete dosiahnuť maximálnu kompatibilitu s rozšíreniami C, použite CPython.

PyPy funguje najlepšie s dlhšie bežiacimi programami

Jedným z vedľajších účinkov toho, ako program PyPy optimalizuje programy v jazyku Python, je to, že z jeho optimalizácie majú najväčší úžitok dlhšie fungujúce programy. Čím dlhšie program beží, tým viac informácií o type run-time dokáže PyPy zhromaždiť a môže vykonať viac optimalizácií. Skripty Python typu one-and-done nebudú mať z tohto druhu úžitku. Aplikácie, ktoré majú výhody, majú zvyčajne cykly, ktoré bežia dlho, alebo bežia nepretržite na pozadí - napríklad webové rámce.

PyPy nerobí kompiláciu vopred

PyPyzostavuje Pythonský kód, ale nie jekompilátor pre kód Python. Kvôli spôsobu, akým PyPy vykonáva svoje optimalizácie a inherentnej dynamike Pythonu, neexistuje spôsob, ako výsledný kód JITted vydať ako samostatný binárny súbor a znova ho použiť. Každý program musí byť zostavený pre každé spustenie. Ak chcete skompilovať Python do rýchlejšieho kódu, ktorý je možné spustiť ako samostatnú aplikáciu, použite programy Cython, Numba alebo aktuálne experimentálny projekt Nuitka.

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