Programiranje

Kaj je Cython? Python s hitrostjo C.

Python slovi kot eden najbolj priročnih, bogato opremljenih in naravnost uporabnih programskih jezikov. Hitrost izvedbe? Ne preveč.

Vnesite Cython. Jezik Cython je nadnabor Pythona, ki se prevede v C in prinese povečanje zmogljivosti, ki se lahko giblje od nekaj odstotkov do več vrst velikosti, odvisno od trenutne naloge. Za delo, ki ga vežejo Pythonove izvorne vrste predmetov, pospeševanja ne bodo velika. Toda pri numeričnih operacijah ali kakršnih koli operacijah, ki ne vključujejo Pythonovih notranjih komponent, je lahko dobiček ogromen.

S Cythonom lahko premagate številne domače omejitve Pythona ali jih v celoti presežete, ne da bi se morali odreči Pythonovi enostavnosti in udobju. V tem članku se bomo sprehodili skozi osnovne koncepte, ki stojijo za Cythonom, in ustvarili preprosto aplikacijo Python, ki uporablja Cython za pospeševanje ene od svojih funkcij.

Sorodni video: Uporaba Cythona za pospešitev Pythona

Prevedite Python v C

Koda Python lahko kliče neposredno v C module. Ti moduli C so lahko splošne knjižnice C ali knjižnice, izdelane posebej za delo s Pythonom. Cython generira drugo vrsto modula: knjižnice C, ki se pogovarjajo s Pythonovimi notranjimi elementi in jih je mogoče združiti z obstoječo kodo Pythona.

Koda Cython je po svoji zasnovi podobna kodi Python. Če prevajalniku Cython pošljete program Python (oba sta podprta Python 2.x in Python 3.x), ga bo Cython sprejel takšnega, kakršen je, vendar ne bo prišlo do nobenega Cythonovega domačega pospeševanja. Če pa kodo Python okrasite s pripisi tipov v posebni sintaksi Cythona, bo Cython lahko počasi predmete Python nadomestil hitre ekvivalente C.

Upoštevajte, da je Cythonov pristop takinkrementalno. To pomeni, da lahko razvijalec začne zobstoječe Python in jo pospešite tako, da na kraju samem spremenite kodo, namesto da celotno aplikacijo prepišete od začetka.

Ta pristop je na splošno povezan z naravo težav z zmogljivostjo programske opreme. V večini programov je velika večina CPU intenzivne kode skoncentrirana na nekaj vročih točk - različici Paretovega načela, znanem tudi kot pravilo "80/20". Tako večine kode v aplikaciji Python ni treba optimizirati glede zmogljivosti, le nekaj kritičnih kosov. Te vroče točke lahko postopoma prevedete v Cython in tako pridobite večjo zmogljivost, kot jo potrebujete. Preostali del programa lahko ostane v Pythonu za udobje razvijalcev.

Kako uporabljati Cython

Upoštevajte naslednjo kodo, povzeto iz Cythonove dokumentacije:

def f (x):

vrnitev x ** 2-x

def integrate_f (a, b, N):

s = 0

dx = (b-a) / N

za i v območju (N):

s + = f (a + i * dx)

vrnitev s * dx

To je primer igrače, ne preveč učinkovito izvajanje integralne funkcije. Kot čista koda Python je počasna, ker mora Python pretvarjati naprej in nazaj med številskimi tipi, ki jih izvirajo iz računalnika, in lastnimi notranjimi vrstami predmetov.

Zdaj razmislite o različici Cython iste kode s poudarjenimi dodatki Cython:

 cdef dvojni f (dvojni x):

vrnitev x ** 2-x

def integrate_f (dvojni a, dvojni b, int N):

cdef int i

cdef dvojni s, x, dx

s = 0

dx = (b-a) / N

za i v območju (N):

s + = f (a + i * dx)

vrnitev s * dx

Če izrecno deklariramo vrste spremenljivk, tako za parametre funkcije kot za spremenljivke, uporabljene v telesu funkcije (dvojno, intitd.), bo Cython vse to prevedel v C. Lahko uporabimo tudi cdef ključna beseda za določanje funkcij, ki se za dodatno hitrost izvajajo predvsem v jeziku C, vendar jih lahko pokličejo samo druge funkcije Cython in ne skripti Python. (Samo v zgornjem primeru integrate_f lahko pokliče drug skript Python.)

Upoštevajte, kako malo je naše dejanskoKoda se je spremenilo. Vse, kar smo storili, je, da obstoječi kodi dodamo izjave o tipih, da dosežemo znatno povečanje zmogljivosti.

Prednosti Cythona

Cython poleg tega, da lahko pospeši kodo, ki ste jo že napisali, nudi še nekaj drugih prednosti:

Delo z zunanjimi knjižnicami C je lahko hitrejše

Paketi Python, kot je NumPy, zavijejo knjižnice C v Pythonove vmesnike, da jih olajša delo. Vendar pa lahko premikanje med Pythonom in C skozi te ovoje stvari upočasni. Cython vam omogoča neposreden pogovor z osnovnimi knjižnicami, ne da bi vam oviral Python. (Podprte so tudi knjižnice C ++.)

Uporabite lahko upravljanje s pomnilnikom C in Python

Če uporabljate predmete Python, se z njimi upravlja s pomnilnikom in zbira smeti, enako kot v običajnem Pythonu. Če pa želite ustvariti in upravljati lastne strukture na ravni C, in jih uporabljati malloc/prost če želite delati z njimi, lahko to storite. Samo ne pozabite počistiti za seboj.

Po potrebi se lahko odločite za varnost ali hitrost

Cython samodejno izvaja preverjanja izvajalnega okolja za pogoste težave, ki se pojavijo v jeziku C, na primer dostop zunaj meja do polja, prek okrasnih elementov in direktiv prevajalnika (npr. @boundscheck (False)). Zato je koda C, ki jo generira Cython, privzeto veliko varnejša od ročno valjane kode C, čeprav je verjetno za ceno surovega delovanja.

Če ste prepričani, da teh pregledov med izvajanjem ne boste potrebovali, jih lahko onemogočite za dodatna povečanja hitrosti bodisi v celotnem modulu bodisi samo v izbranih funkcijah.

Cython vam omogoča tudi naravni dostop do struktur Python, ki uporabljajo medpomnilniški protokol za neposreden dostop do podatkov, shranjenih v pomnilniku (brez vmesnega kopiranja). Cythonovi spominski pogledi vam omogočajo, da s temi strukturami delate z veliko hitrostjo in s stopnjo varnosti, ki ustreza nalogi. Neobdelane podatke, na katerih temelji niz Python, lahko na primer beremo na ta način (hitro), ne da bi morali iti skozi Pythonovo izvajanje (počasno).

Koda Cython C lahko koristi izdaji GIL

Pythonova Global Interpreter Lock ali GIL sinhronizira niti znotraj tolmača, ščiti dostop do Pythonovih predmetov in upravlja prepiranje virov. Toda GIL je bil pogosto kritiziran kot kamen spotike bolj uspešnega Pythona, zlasti v večjedrnih sistemih.

Če imate del kode, ki se ne sklicuje na predmete Python in izvaja dolgotrajno operacijo, jo lahko označite zz nogil: direktivo, ki omogoča izvajanje brez GIL. To razbremeni razlagalnik Python, da počne druge stvari, in kodi Cython omogoča uporabo več jeder (z dodatnim delom).

Cython lahko uporablja sintakso namiganja vrste Python

Python ima sintakso, ki namiguje na tip, ki jo uporabljajo predvsem povezovalci in pregledovalniki kod, ne pa tolmač CPython. Cython ima lastno sintakso po meri za okraske kode, vendar lahko z nedavnimi revizijami Cythona sintakso namigovanja vrste Python uporabite tudi za zagotavljanje osnovnih namigov tipa Cythonu.

Cython lahko uporabimo za zakrivanje občutljive kode Pythona

Module Python je trivialno enostavno razstaviti in pregledati, sestavljeni binarni programi pa ne. Če želite del svojih aplikacij distribuirati končnim uporabnikom, če želite zaščititi nekatere njegove module pred naključnim vohljanjem, lahko to storite tako, da jih sestavite s Cythonom. Upoštevajte, da je to a stranski učinek Cythonovih zmožnosti, niti ena od predvidenih funkcij.

Omejitve citona

Upoštevajte, da Cython ni čarobna palica. Samodejno ne spremeni vsakega primera poky kode Python v hitro pihajočo kodo C. Če želite Cython kar najbolje izkoristiti, ga morate pametno uporabljati - in razumeti njegove omejitve:

Malo pospeševanja običajne kode Python

Ko Cython naleti na kodo Python, ki je ne more popolnoma prevesti v jezik C, to kodo pretvori v vrsto C klicev na Pythonovo notranjost. To pomeni, da Pythonov tolmač izvlečemo iz izvedbene zanke, kar privzeto daje kodo skromno 15 do 20-odstotno pospešitev. Upoštevajte, da je to najboljši primer; v nekaterih primerih morda ne boste opazili izboljšanja zmogljivosti ali celo poslabšanja zmogljivosti.

Malo pospeševanja izvornih podatkovnih struktur Python

Python ponuja množico podatkovnih struktur - nizov, seznamov, nabora, slovarjev itd. So izjemno priročni za razvijalce in imajo lastno samodejno upravljanje pomnilnika. So pa počasnejši od čiste C.

Cython vam omogoča, da še naprej uporabljate vse podatkovne strukture Pythona, čeprav brez večjega pospeševanja. To je spet zato, ker Cython v izvajalnem okolju Pythona preprosto pokliče API-je C, ki ustvarjajo in manipulirajo s temi predmeti. Tako se podatkovne strukture Pythona vedejo podobno kot Pythonova koda, optimizirana za Cython: Včasih dobite spodbudo, vendar le malo. Za najboljše rezultate uporabite spremenljivke in strukture C. Dobra novica je, da Cython olajša sodelovanje z njimi.

Koda Cython deluje najhitreje, ko je "čisti C"

Če imate funkcijo v C, označeno z cdef ključna beseda z vsemi svojimi spremenljivkami in vgrajenimi funkcijskimi klici drugih stvari, ki so čisti C, bo delovala tako hitro, kot zna C. Če pa se ta funkcija sklicuje na katero koli Python-ov izvorno kodo, na primer podatkovno strukturo Python ali klic notranjega API-ja Python, bo ta klic ozko grlo pri zmogljivosti.

Na srečo Cython ponuja način za odkrivanje teh ozkih grl: poročilo o izvorni kodi, ki na prvi pogled pokaže, kateri deli aplikacije Cython so čisti C in kateri deli sodelujejo s Pythonom. Bolje kot je aplikacija optimizirana, manj interakcije bo s Pythonom.

Cython NumPy

Cython izboljša uporabo neodvisnih knjižnic za drobljenje številk, kot je NumPy. Ker se koda Cython prevaja v C, lahko neposredno komunicira s temi knjižnicami in iz zanke odstrani Pythonova ozka grla.

Toda NumPy še posebej dobro deluje s Cythonom. Cython ima domačo podporo za posebne konstrukcije v NumPy in omogoča hiter dostop do nizov NumPy. In enako znano sintakso NumPy, ki bi jo uporabili v običajnem skriptu Python, lahko v Cythonu uporabljamo takšno, kakršna je.

Če pa želite med Cythonom in NumPy ustvariti čim bližje vezi, morate kodo dodatno okrasiti s Cythonovo sintakso po meri. Thecimport stavek, na primer, omogoča kodi Cython, da vidi konstrukte na ravni C v knjižnicah v času prevajanja za čim hitrejše vezave.

Ker se NumPy tako pogosto uporablja, Cython podpira NumPy "izven škatle". Če imate nameščen NumPy, lahko samo navedetecimport numpy v svojo kodo, nato dodajte nadaljnjo dekoracijo za uporabo izpostavljenih funkcij.

Cython profiliranje in zmogljivost

Vsako kodo dobite najbolje, če jo profilirate in iz prve roke vidite, kje so ozka grla. Cython ponuja kljuke za Pythonov modul cProfile, tako da lahko z lastnimi orodji za profiliranje Pythona, kot je cProfile, vidite, kako deluje vaša koda Cython.

V vseh primerih si pomagamo zapomniti, da Cython ni magija - da še vedno veljajo smiselne prakse v resničnem svetu. Manj ko preklapljate med Python in Cython, hitreje se bo vaša aplikacija zagnala.

Če imate na primer zbirko predmetov, ki jih želite obdelovati v Cythonu, jih ne pregledujte v Pythonu in pri vsakem koraku prikličite funkcijo Cython. Mimo celotna zbirka do vašega modula Cython in tam ponovite. Ta tehnika se pogosto uporablja v knjižnicah, ki upravljajo podatke, zato je dober model za posnemanje lastne kode.

Python uporabljamo, ker zagotavlja udobje programerja in omogoča hiter razvoj. Včasih ta produktivnost programerja stane na račun zmogljivosti. Z Cythonom vam lahko le malo dodatnega truda prinese najboljše iz obeh svetov.

Preberite več o Pythonu

  • Kaj je Python? Zmogljivo, intuitivno programiranje
  • Kaj je PyPy? Hitrejši Python brez bolečin
  • Kaj je Cython? Python s hitrostjo C.
  • Vadnica za Cython: Kako pospešiti Python
  • Kako namestiti Python na pameten način
  • Najboljše novosti v Pythonu 3.8
  • Boljše upravljanje Python projektov s Poetry
  • Virtualenv in venv: Razložena navidezna okolja Python
  • Python virtualenv in venv dela in ne sme
  • Razloženi navoji Python in podprocesi
  • Kako uporabljati razhroščevalnik Python
  • Kako uporabiti timeit za profiliranje kode Python
  • Kako uporabiti cProfile za profiliranje kode Python
  • Začnite z async v Pythonu
  • Kako uporabljati asyncio v Pythonu
  • Kako pretvoriti Python v JavaScript (in nazaj)
  • Python 2 EOL: Kako preživeti konec Pythona 2
  • 12 Pythonov za vsako programsko potrebo
  • 24 Python knjižnic za vsakega razvijalca Pythona
  • 7 sladkih ID-jev Python, ki ste jih morda zamudili
  • 3 glavne pomanjkljivosti Pythona - in njihove rešitve
  • 13 primerjanih spletnih okvirov Python
  • 4 Python testni okviri za zmečkanje napak
  • 6 odličnih novih funkcij Pythona, ki jih ne želite zamuditi
  • 5 distribucij Pythona za obvladovanje strojnega učenja
  • 8 odličnih Pythonovih knjižnic za obdelavo naravnega jezika
$config[zx-auto] not found$config[zx-overlay] not found