Programování

Co je PyPy? Rychlejší Python bez bolesti

Python si získal pověst výkonného, ​​flexibilního a snadno se s ním pracuje. Tyto ctnosti vedly k jeho použití v obrovské a rostoucí paletě aplikací, pracovních toků a polí. Ale design jazyka - jeho interpretovaná povaha, jeho běhová dynamika - znamená, že Python byl vždy o řád pomalejší než strojově nativní jazyky jako C nebo C ++.

V průběhu let přišli vývojáři s řadou řešení omezení rychlosti Pythonu. Například můžete psát úkoly náročné na výkon v jazyce C a zabalit je do Pythonu; mnoho knihoven strojového učení dělá přesně tohle. Nebo můžete použít Cython, projekt, který vám umožní posypat Pythonský kód informacemi o typu běhového modulu, který umožňuje jeho kompilaci do C.

Řešení však nikdy nejsou ideální. Nebylo by skvělé, kdybychom si mohli vzít pouze existující program v Pythonujak jea spustit jej dramaticky rychleji? To je přesně to, co vám PyPy umožňuje.

Související video: Používání modulu runtime PyPy pro Python

PyPy vs. CPython

PyPy je náhrada za drop-in pro Python interpreter CPython. Zatímco CPython kompiluje Python na přechodný bytecode, který je pak interpretován virtuálním strojem, PyPy používá kompilaci just-in-time (JIT) k překladu kódu Pythonu do strojově nativního montážního jazyka.

V závislosti na prováděném úkolu mohou být zvýšení výkonu dramatické. V průměru PyPy zrychluje Python přibližně 7,6krát, přičemž některé úkoly byly zrychleny 50krát nebo více. Interpret CPython jednoduše neprovádí stejné druhy optimalizací jako PyPy a pravděpodobně nikdy nebude, protože to není jeden z jeho návrhových cílů.

Nejlepší na tom je, že pro odemknutí výhod, které PyPy poskytuje, není na straně vývojáře zapotřebí žádné úsilí. Jednoduše vyměňte CPython za PyPy a z větší části jste hotovi. Existuje několik výjimek, které jsou popsány níže, ale stanoveným cílem PyPy je spustit existující nemodifikovaný kód Pythonu a poskytnout mu automatické zvýšení rychlosti.

PyPy v současné době podporuje jak Python 2, tak Python 3, a to prostřednictvím různých inkarnací projektu. Jinými slovy, musíte si stáhnout různé verze PyPy v závislosti na verzi Pythonu, kterou budete používat. Pobočka PyPonu 2 PyPy je tu mnohem déle, ale verze Pythonu 3 byla pozdě zpožděna. V současné době podporuje jak Python 3.5 (kvalita produkce), tak Python 3.6 (kvalita beta).

Kromě podpory všech základních jazyků Pythonu pracuje PyPy s převážnou většinou nástrojů v pythonovském ekosystému, jako jsoupip pro balení nebovirtualenv pro virtuální prostředí. Většina balíčků Pythonu, dokonce i balíčky s moduly C, by měla fungovat tak, jak jsou, i když existují omezení, která pojdeme níže.

Jak funguje PyPy

PyPy používá optimalizační techniky nalezené v jiných kompilátorech just-in-time pro dynamické jazyky. Analyzuje spuštěné programy v Pythonu, aby určil typové informace o objektech tak, jak jsou vytvářeny a používány v programech, a pak použije tyto typové informace jako vodítko k urychlení věci. Například pokud funkce Pythonu pracuje pouze s jedním nebo dvěma různými typy objektů, PyPy vygeneruje strojový kód pro zpracování těchto konkrétních případů.

Optimalizace PyPy se zpracovávají automaticky za běhu, takže obecně nemusíte vylepšovat její výkon. Pokročilý uživatel může experimentovat s možnostmi příkazového řádku PyPy, aby vygeneroval rychlejší kód pro speciální případy, ale jen zřídka je to nutné.

PyPy se také odchyluje od způsobu, jakým CPython zpracovává některé interní funkce, ale snaží se zachovat kompatibilní chování. Například PyPy zpracovává odvoz odpadu jinak než CPython. Ne všechny objekty jsou okamžitě shromážděny, jakmile vyjdou z rozsahu, takže program Pythonu spuštěný pod PyPy může vykazovat větší paměťovou stopu, než když běží pod CPythonem. Stále však můžete použít ovládací prvky Pythonu na vysoké úrovni, které jsou vystaveny prostřednictvím gc modul, jako je gc.enable (), gc.disable (), a gc.collect ().

Pokud chcete informace o chování JIT PyPy za běhu, PyPy obsahuje modul, pypyjit, který odhaluje mnoho háčků JIT pro vaši aplikaci v Pythonu. Pokud máte funkci nebo modul, který podle všeho nefunguje dobře s JIT, pypyjit umožňuje získat podrobné statistiky o tom.

Další modul specifický pro PyPy, __pypy__, vystavuje další funkce specifické pro PyPy, takže může být užitečné pro psaní aplikací, které tyto funkce využívají. Kvůli dynamice běhového prostředí Pythonu je možné vytvářet aplikace Pythonu, které používají tyto funkce, když je PyPy přítomen, a ignoruje je, pokud tomu tak není.

Omezení PyPy

Jak se může PyPy zdát kouzelné, není to kouzlo. PyPy má určitá omezení, která snižují nebo vylučují jeho účinnost pro určité druhy programů. Bohužel, PyPy není zcela univerzální náhradou za běh CPython.

PyPy funguje nejlépe s čistými aplikacemi Pythonu

PyPy vždy fungoval nejlépe s „čistými“ aplikacemi Pythonu - tj. Aplikacemi napsanými v Pythonu a ničím jiným. Balíčky Pythonu, které se propojují s knihovnami C, jako je NumPy, se také nedaří kvůli způsobu, jakým PyPy emuluje nativní binární rozhraní CPython.

Vývojáři PyPy se u tohoto problému zbavili a učinili PyPy kompatibilnější s většinou balíčků Pythonu, které jsou závislé na příponách C. Například Numpy nyní funguje velmi dobře s PyPy. Pokud však chcete maximální kompatibilitu s rozšířeními C, použijte CPython.

PyPy funguje nejlépe s delšími programy

Jedním z vedlejších účinků, jak PyPy optimalizuje programy Pythonu, je to, že z jeho optimalizací těží nejvíce běžící programy. Čím déle program běží, tím více informací o typu běhu může PyPy shromáždit a tím více optimalizací může provést. Skripty Python typu one-and-done nebudou z těchto věcí těžit. Aplikace, které mají výhodu, mají obvykle smyčky, které běží po dlouhou dobu nebo běží nepřetržitě na pozadí - například webové rámce.

PyPy nedělá kompilace předem

PyPysestavuje Pythonský kód, ale nenípřekladač pro kód Pythonu. Z důvodu způsobu, jakým PyPy provádí své optimalizace a inherentní dynamiky Pythonu, neexistuje způsob, jak vydat výsledný JITted kód jako samostatný binární soubor a znovu jej použít. Každý program musí být sestaven pro každé spuštění. Pokud chcete zkompilovat Python do rychlejšího kódu, který lze spustit jako samostatnou aplikaci, použijte Cython, Numba nebo aktuálně experimentální projekt Nuitka.