Ubrzavanje Pythona
Katkada korištenje Numpy-a ne daje dovoljno ubrzanje, ili je teško/nespretno vektorizirati kod. Tada postoji više opcija
spori dio koda (koji dio koda je spor možemo saznati profiliranjem koda, npr. pomoću IPythonove magične funkcije
%prun
) možemo napisati npr. u C-u. U Pythonu je taj proces prilično bezbolan.spori dio koda možemo implementirati u Cythonu, koji je proširenje Pythona
možemo ubrzati kod korištenjem specijaliziranih kompajlera koji optimiziraju strojni kod
Cython
%%cython_inline
magična funkcija koristi Cython.inline
da bi se kompajlirao Cython izraz. return
služi za slanje izlaza.
%%cython_pyximport
magična funkcija služi da se unese proizvoljan Cython kod u IPython notebook ćeliju. Taj kod se sprema u .pyx
u radnom direktoriju i onda importira koristeći pyximport
. Moramo specificirati ime modula (u donjem slučaju foo
). Svi objekti modula se automatski importiraju.
U dosadašnjim primjerima Cython kod se nije razlikovao od Python koda. U sljedećem primjeru ćemo vidjeti neka od proširenja Pythona koja nudi Cython.
Magična funkcija %%cython
je slična funkciji %%cython_pyximport
, ali ne traži ime modula te sve datoteke sprema u privremeni direktorij.
Jedan od načina računanja broja je korištenjem formule A integral možemo aproksimirati pomoću trapezne formule, što nam daje Krenimo od običnog Pythona.
Cython verzija
Ovdje je
cimport
: ekvivalent importa, ali možemo učitavati i iz C ili C++ bibliotekacdef
: ekvivalent za def, gdje definiramo (kao u C-u) tipove podataka; također služi za deklariranje tipa varijabli
Složeniji primjer
Ovdje je
@
: Pythonova sintaksa za tzv. dekoratorenogil
: GIL je skraćenica od global interpreter lock, koji spriječava simultano izvršavanje koda u više niti (eng. threads), ovdje snogil
deklariramo da je sigurno pozvati funkciju bez GIL-awith nogil
: odgovarajući dio koda ne koristi GIL
Cython omogućava linkanje dodatnih biblioteka pri kompajliranju, u ovom slučaju standardne matematičke biblioteke
Još jedan primjer, gdje koristimo numpy nizove
Računamo kumulativnu sumu niza
Numba
Numba je just-in-time kompajler koji korisiti LLVM. Korištenje numbe je zapravo dosta jednostavno.
Funkcija sum2d(arr)
će biti optimizirana, a cijela procedura se svela na korištenje jednog dekoratora.
Kompliciraniji primjer
Paralelizacija
Drugi način ubrzavanja izvršavanja programa je pomoću paralelizacije. To je opsežna tema sama po sebi te u nju nećemo ulaziti. Popularni način paralelizacije je npr. pomoću Apache Sparka ili pomoću Dask biblioteke.
Python verzija | 3.5.4 |
kompajler | GCC 4.8.2 20140120 (Red Hat 4.8.2-15) |
sustav | Linux |
broj CPU-a | 4 |
interpreter | 64bit |
cython verzija | 0.26.1 |
numpy verzija | 1.11.3 |
numba verzija | 0.35.0 |