Obsah

Zrýchlenie kódu Python pomocou Microsoft Pyjion

Pyjion je open-source projekt určený na zlepšenie výkonu kódu Pythonu prostredníctvom optimalizovaných možností kompilácie JIT balíka .NET. Pomocou Pyjion môžete dosiahnuť výrazné zvýšenie rýchlosti aplikácií v jazyku Python. V tomto článku sa dozviete, ako optimalizovať a zrýchliť kód jazyka Python.

Čo je Pyjion

Najbežnejším spôsobom, ako zrýchliť kód jazyka Python, je použitie CPythonu, oficiálneho interpretu jazyka Python. Ten kompiluje kód do sprostredkujúceho jazyka nazývaného bytecode a vyhodnocuje tento kód vždy, keď sa váš kód vykonáva. To umožňuje veľkú flexibilitu, ale má to aj nevýhodu. Jednoduché výpočty, pri ktorých sú procesory veľmi efektívne, ako napríklad aritmetika celých čísel a čísel s pohyblivou rádovou čiarkou, sú v CPythone výrazne pomalšie ako v iných interpretoch.

V praxi si vývojári jazyka Python osvojujú nástroje ako Cython, aby zefektívnili numerické operácie kompilovaním kódu v predstihu pomocou rozšírení jazyka C. Je to efektívne riešenie z hľadiska výkonu, ale nie je ideálne na rýchlu iteráciu alebo experimentovanie, najmä v zápisníkoch Jupyter.

Tu prichádza na pomoc Pyjion. Pyjion je balík Pythonu 3.10, ktorý analyzuje kód Pythonu a optimalizuje ho za behu pomocou kompilátora JIT alebo “Just-in-Time”. V programe ho možno použiť jednoduchým importom knižnice Pyjion a jej povolením. Všetko, čo sa spustí po tomto príkaze, je skompilované JIT.

Ako sa vyslovuje

“Pyjion” sa vyslovuje ako slovo “pigeon” (holub). @DinoV chcel názov, ktorý by obsahoval niečo s “Python” - časť “Py” - a niečo s “JIT” - časť “JI” - a aby sa to dalo vysloviť.

Hlavné funkcie

  • Kompilátor JIT riadený profilom
  • Natívna podpora 64-bitových plávajúcich a celých čísel
  • Malý, rýchly kompilátor
  • Windows, macOS a Linux
  • Podpora procesorov Intel a ARM
  • Zabudovaný disasembler IL a ASM
  • Podpora natívnych nástrojov na ladenie a profilovanie

Technológia

Pyjion kompiluje natívny CPython bytecode do strojového kódu. Bez Pyjionu používa CPython na iteráciu cez opkódy hlavnú vyhodnocovaciu slučku (nazývanú frame evaluation loop). Kompilátor Pyjion má 3 hlavné fázy:

  • Zostavenie “zásobníkovej tabuľky” abstraktných typov na každej pozícii opkódu
  • Kompilácia opkódov CPythonu do inštrukcií IL (ECMA335 CIL)
  • Odoslanie opkódov CIL do kompilátora .NET EE na prevod do natívneho strojového kódu/asembláže

Benchmarky

Porovnávacie testy vykonané správcami projektu ukazujú, že Pyjion je pri reálnej práci približne dva- až trikrát rýchlejší ako bežný Python.

Pyjion Benchmarks
Python 3.10 vs Python 3.10 + Pyjion

Niektoré optimalizácie umožňujú až 10-násobné zrýchlenie. Bežná aritmetika, ktorá je vždy vhodným kandidátom na optimalizáciu JIT, môže byť rádovo rýchlejšia.

Obmedzenia

Niektoré funkcie jazyka Python, ako napríklad príkazy with alebo async..await, nie sú zatiaľ implementované. Obe sú na pláne. Pyjion obsahuje middleware vrstvu, ktorá umožňuje spúšťanie aplikácií WSGI na Pyjione. Dlhodobo bežiace aplikácie, ako sú webové aplikácie, sú dobrými kandidátmi na akceleráciu JIT.

Inštalácia

Pyjion vyžaduje:

Po vykonaní inštalačných krokov je Pyjion len modul Pythonu, ktorý môžete importovať do svojho prostredia Pythonu:

1
python -m pip install pyjion

Po importovaní Pyjionu zapnite JIT pomocou funkcie enable:

1
2
import pyjion
pyjion.enable()

Každý kód Pythonu, ktorý napíšete alebo importujete po zapnutí funkcie Pyjion, bude skompilovaný JIT. Nemusíte vykonávať funkcie v žiadnom špeciálnom API, je to úplne transparentné:

1
2
3
4
>>> def half(x):
...    return x/2
>>> half(2)
1.0

Program Pyjion môžete spustiť aj proti akémukoľvek skriptu alebo modulu:

1
pyjion my_script.py

Alebo pre existujúci modul Pythonu:

1
pyjion -m calendar

To je všetko!

Porovnanie

Ako sa Pyjion porovnáva s:

PyPy

Site: https://www.pypy.org/

PyPy je implementácia jazyka Python s vlastným JIT. Najväčší rozdiel oproti PyPy je v tom, že PyPy nepodporuje všetky rozširujúce moduly jazyka C bez úprav, pokiaľ nepoužívajú CFFI alebo nepracujú s vybranou podmnožinou API jazyka C CPython, ktorú PyPy podporuje. Pyjion sa tiež zameriava na podporu mnohých kompilátorov JIT, zatiaľ čo PyPy podporuje len svoj vlastný kompilátor JIT.

Pyston

Site: https://github.com/pyston/pyston

Pyston je implementácia jazyka Python využívajúca LLVM ako kompilátor JIT. V porovnaní s Pyjionom má Pyston čiastočnú podporu CPython C API, ale nie úplnú. Pyston tiež podporuje iba LLVM ako kompilátor JIT.

Numba

Site: https://numba.pydata.org/

Numba je kompilátor JIT pre “kód Pythonu orientovaný na polia a náročný na matematiku”. To znamená, že Numba je zameraná na vedecké výpočty, zatiaľ čo Pyjion sa snaží optimalizovať všetok kód Pythonu. Numba tiež podporuje iba LLVM.

IronPython

Site: https://ironpython.net/

IronPython je implementácia jazyka Python, ktorá je implementovaná pomocou .NET. Zatiaľ čo IronPython sa snaží byť použiteľný z prostredia .NET, Pyjion nemá príbeh o kompatibilite s .NET. To tiež znamená, že IronPython nemôže používať moduly rozšírenia C, zatiaľ čo Pyjion môže.

Nuitka, Shedskin

Site Nuitka: https://nuitka.net/pages/overview.html

Site Shedskin: https://github.com/shedskin/shedskin

Nuitka aj Shedskin sú transpilátory jazyka Python do jazyka C++, čo znamená, že prekladajú kód jazyka Python do ekvivalentného kódu jazyka C++. Keďže Pyjion je JIT, nie je transpiler.

Užitočné odkazy