Ohjelmointi

Mikä on Cython? Python nopeudella C

Pythonilla on maine yhtenä mukavimmista, rikkaimmin varustetuista ja suorastaan ​​hyödyllisistä ohjelmointikielistä. Suoritusnopeus? Ei niin paljon.

Syötä Cython. Cython-kieli on Pythonin supersarja, joka kääntyy C: ksi ja tuottaa suorituskyvyn parannuksia, jotka voivat vaihdella muutamasta prosentista useisiin suuruusluokkiin riippuen käsillä olevasta tehtävästä. Työssä, joka on sidottu Pythonin natiivikohdetyyppien kanssa, nopeudet eivät ole suuria. Mutta numeerisissa operaatioissa tai muissa operaatioissa, joissa ei ole mukana Pythonin sisäisiä osia, voitot voivat olla valtavat.

Cythonin avulla voit peittää monet Pythonin alkuperäisistä rajoituksista tai ylittää ne kokonaan - sinun ei tarvitse luopua Pythonin helppoudesta ja mukavuudesta. Tässä artikkelissa käymme läpi Cythonin peruskäsitteet ja luomme yksinkertaisen Python-sovelluksen, joka käyttää Cythonia nopeuttamaan yhtä sen toiminnoista.

Aiheeseen liittyvä video: Cythonin käyttäminen Pythonin nopeuttamiseksi

Käännä Python C: ksi

Python-koodi voi soittaa suoraan C-moduuleihin. Nämä C-moduulit voivat olla joko yleisiä C-kirjastoja tai kirjastoja, jotka on erityisesti rakennettu toimimaan Pythonin kanssa. Cython luo toisenlaisen moduulin: C-kirjastot, jotka keskustelevat Pythonin sisäisten osien kanssa ja jotka voidaan niputtaa olemassa olevaan Python-koodiin.

Cython-koodi näyttää muotoilultaan paljon kuin Python-koodi. Jos syötät Cython-kääntäjälle Python-ohjelmaa (Python 2.x ja Python 3.x ovat molemmat tuettuja), Cython hyväksyy sen sellaisenaan, mutta mikään Cythonin alkuperäisistä kiihdytyksistä ei tule esiin. Mutta jos koristelet Python-koodin tyyppihuomautuksilla Cythonin erityisessä syntaksissa, Cython pystyy korvaamaan nopeat C-ekvivalentit hitailla Python-objekteilla.

Huomaa, että Cythonin lähestymistapa onasteittainen. Tämä tarkoittaa, että kehittäjä voi aloittaanykyinen Python-sovellus ja nopeuta sitä tekemällä pistemuutoksia koodiin sen sijaan, että kirjoittaisit koko sovelluksen alusta asti.

Tämä lähestymistapa vastaa ohjelmistojen suorituskykyongelmien luonnetta yleensä. Useimmissa ohjelmissa valtaosa suorittimenintensiivisistä koodeista on keskitetty muutamaan hot spotiin - versio Pareto-periaatteesta, joka tunnetaan myös nimellä “80/20” -sääntö. Siksi suurinta osaa Python-sovelluksen koodista ei tarvitse optimoida suorituskykyyn, vain muutama kriittinen kappale. Voit kääntää nämä hot spotit vähitellen Cythoniksi, jotta saat tarvitsemasi suorituskyvyn sinne, missä sillä on eniten merkitystä. Loput ohjelmasta voivat pysyä Pythonissa kehittäjien mukavuuden vuoksi.

Kuinka käyttää Cythonia

Harkitse seuraavaa koodia, joka on otettu Cythonin dokumentaatiosta:

def f (x):

paluu x ** 2-x

def integraatio_f (a, b, N):

s = 0

dx = (b-a) / N

i: lle alueella (N):

s + = f (a + i * dx)

palaa s * dx

Tämä on leluesimerkki, kiinteän toiminnon ei-kovin tehokas toteutus. Puhtaana Python-koodina se on hidasta, koska Pythonin on muunnettava edestakaisin konekielisten numeeristen tyyppien ja omien sisäisten objektityyppien välillä.

Harkitse nyt saman koodin Cython-versiota ja korosta Cythonin lisäykset:

 cdef double f (kaksinkertainen x):

paluu x ** 2-x

def integraatio_f (kaksinkertainen a, kaksinkertainen b, int N):

cdef int i

cdef kaksinkertainen s, x, dx

s = 0

dx = (b-a) / N

i: lle alueella (N):

s + = f (a + i * dx)

palaa s * dx

Jos ilmoitamme nimenomaisesti muuttujatyypit sekä funktioparametreille että funktion rungossa käytetyille muuttujille (kaksinkertainen, int, jne.), Cython kääntää kaiken tämän C: ksi. Voimme käyttää myös cdef avainsana määrittää toiminnot, jotka toteutetaan ensisijaisesti C: ssä lisänopeuden saavuttamiseksi, vaikka niitä voidaan kutsua vain muilla Cython-funktioilla eikä Python-komentosarjoilla. (Vain yllä olevassa esimerkissä integroida_f voidaan kutsua toisella Python-komentosarjalla.)

Huomaa kuinka vähän todellinenkoodi on muuttunut. Ainoa mitä olemme tehneet, on lisätä tyypin ilmoitukset olemassa olevaan koodiin saadaksesi merkittävän suorituskyvyn.

Cython-edut

Sen lisäksi, että Cython pystyy nopeuttamaan jo kirjoittamaasi koodia, se tarjoaa useita muita etuja:

Työskentely ulkoisten C-kirjastojen kanssa voi olla nopeampaa

PyPon-paketit, kuten NumPy, kääri C-kirjastot Python-rajapintoihin, jotta niiden kanssa olisi helppo työskennellä. Pythonin ja C: n välillä edestakaisin kulkeminen näiden kääreiden läpi voi kuitenkin hidastaa asioita. Cython antaa sinun puhua taustalla oleviin kirjastoihin suoraan ilman Pythonia. (Myös C ++ -kirjastoja tuetaan.)

Voit käyttää sekä C- että Python-muistinhallintaa

Jos käytät Python-objekteja, niitä hallitaan muistilla ja roskia kerätään samalla tavalla kuin tavallisessa Pythonissa. Mutta jos haluat luoda ja hallita omia C-tason rakenteitasi ja käyttää niitä malloc/vapaa työskennellä heidän kanssaan, voit tehdä niin. Muista vain siivota itsesi jälkeen.

Voit valita turvallisuuden tai nopeuden tarpeen mukaan

Cython suorittaa ajonaikaiset tarkistukset C: ssä esiintyville yleisille ongelmille, kuten matriisin ulkopuolelle pääsylle, sisustajien ja kääntäjädirektiivien avulla (esim. @helsinki (False)). Näin ollen Cythonin luomat C-koodit ovat oletusarvoisesti paljon turvallisempia kuin käsin valssatut C-koodit, vaikkakin mahdollisesti raakan suorituskyvyn kustannuksella.

Jos olet varma, että et tarvitse kyseisiä tarkastuksia ajon aikana, voit poistaa ne käytöstä nopeuden lisäämiseksi joko koko moduulissa tai vain tietyissä toiminnoissa.

Cython antaa sinun myös käyttää luonnollisesti Python-rakenteita, jotka käyttävät puskuriprotokollaa suoraan pääsyyn muistiin tallennettuihin tietoihin (ilman välikopiointia). Cythonin muistikuvien avulla voit työskennellä näiden rakenteiden kanssa suurella nopeudella ja tehtävälle sopivalla turvallisuustasolla. Esimerkiksi Python-merkkijonon taustalla olevat raakatiedot voidaan lukea tällä tavalla (nopeasti) tarvitsematta käydä läpi Python-ajonaikaa (hidas).

Cython C -koodi voi hyötyä GIL: n julkaisemisesta

Pythonin yleinen tulkkilukko eli GIL synkronoi ketjut tulkin sisällä, suojaamalla Python-objektien käyttöä ja hallinnoimalla resurssikilpailua. Mutta GIL: ää on kritisoitu laajalti suorituskykyisen Pythonin kompastuskiveksi, etenkin monisydämisissä järjestelmissä.

Jos sinulla on koodiosa, joka ei viittaa Python-objekteihin ja suorittaa pitkäaikaisen toiminnon, voit merkitä sennogililla: jotta se voisi toimia ilman GIL: ää. Tämä vapauttaa Python-tulkin tekemään muita asioita ja antaa Cython-koodin käyttää useita ytimiä (lisätyöllä).

Cython voi käyttää Python-tyyppistä vihjeiden syntaksia

Pythonissa on tyyppivihjeiden syntaksia, jota käyttävät pääasiassa likat ja koodintarkistajat, ei CPython-tulkki. Cythonilla on oma mukautettu syntaksi koodikoristeluille, mutta viimeisimmillä Cython-versioilla voit käyttää Python-tyyppivihjeiden syntaksia tarjoamaan perustyyppivihjeitä myös Cythonille.

Cythonia voidaan käyttää peittämään arkaluonteisia Python-koodeja

Python-moduuleja on erittäin helppo purkaa ja tarkastaa, mutta käännetyt binäärit eivät. Kun jaat Python-sovelluksen loppukäyttäjille, jos haluat suojata joitain sen moduuleista rennolta harhailulta, voit tehdä sen kokoamalla ne Cythonilla. Huomaa kuitenkin, että tämä on sivuvaikutus Cythonin ominaisuuksista, ei yksi sen tarkoitetuista toiminnoista.

Cython-rajoitukset

Muista, että Cython ei ole taikasauva. Se ei muuta automaattisesti jokaisen muuttuneen Python-koodin esiintymää vilkkaaksi C-koodiksi. Jotta voit hyödyntää Cythonia parhaalla mahdollisella tavalla, sinun on käytettävä sitä viisaasti - ja ymmärrettävä sen rajoitukset:

Pieni nopeus perinteiselle Python-koodille

Kun Cython havaitsee Python-koodin, se ei voi kääntää kokonaan C: ksi, se muuntaa koodin sarjaksi C-kutsuja Pythonin sisäosiksi. Tämä tarkoittaa Pythonin tulkin ottamista ulos suoritussilmukasta, mikä antaa koodille oletusarvoisesti 15-20 prosentin nopeuden. Huomaa, että tämä on paras tapa; joissakin tilanteissa suorituskykyä ei voida parantaa tai edes heikentää suorituskykyä.

Pieni nopeus natiiville Python-tietorakenteille

Python tarjoaa joukon tietorakenteita - merkkijonoja, luetteloita, sarakkeita, sanakirjoja ja niin edelleen. Ne ovat erittäin käteviä kehittäjille, ja niillä on oma automaattinen muistinhallinta. Mutta ne ovat hitaampia kuin puhdas C.

Cython antaa sinun jatkaa kaikkien Python-tietorakenteiden käyttöä, vaikkakin ilman paljon nopeutta. Tämä johtuu jälleen kerran siitä, että Cython yksinkertaisesti kutsuu Python-ajonaikaisessa C-sovellusliittymät, jotka luovat ja manipuloivat näitä objekteja. Siten Python-tietorakenteet käyttäytyvät paljon kuin Cython-optimoitu Python-koodi yleensä: Saat joskus lisäystä, mutta vain vähän. Saat parhaat tulokset käyttämällä C-muuttujia ja rakenteita. Hyvä uutinen on, että Cython tekee heidän kanssaan työskentelemisestä helppoa.

Cython-koodi toimii nopeimmin, kun "puhdas C"

Jos sinulla on toiminto C: ssä, joka on merkitty cdef avainsana, kaikki muuttujat ja inline-funktiokutsut muihin puhtaaseen C: hen, se toimii niin nopeasti kuin C voi mennä. Mutta jos tämä toiminto viittaa mihin tahansa Python-natiivikoodiin, kuten Python-tietorakenteeseen tai sisäisen Python-sovellusliittymän kutsuun, tämä kutsu on suorituskyvyn pullonkaula.

Onneksi Cython tarjoaa tavan havaita nämä pullonkaulat: lähdekoodiraportti, joka näyttää yhdellä silmäyksellä mitkä Cython-sovelluksesi osat ovat puhdasta C: tä ja mitkä osat ovat vuorovaikutuksessa Pythonin kanssa. Mitä paremmin sovellus on optimoitu, sitä vähemmän vuorovaikutusta tulee olemaan Pythonin kanssa.

Cython NumPy

Cython parantaa C-pohjaisten kolmansien osapuolten numeroita puristavien kirjastojen, kuten NumPy, käyttöä. Koska Cython-koodi kääntyy C: ksi, se voi olla vuorovaikutuksessa näiden kirjastojen kanssa suoraan ja poistaa Pythonin pullonkaulat silmukasta.

Mutta erityisesti NumPy toimii hyvin Cythonin kanssa. Cythonilla on alkuperäinen tuki tietyille NumPy-rakenteille ja tarjoaa nopean pääsyn NumPy-matriiseihin. Ja samaa tuttua NumPy-syntaksia, jota käytät tavallisessa Python-komentosarjassa, voidaan käyttää Cythonissa sellaisenaan.

Jos kuitenkin haluat luoda lähimmät mahdolliset siteet Cythonin ja NumPyn välille, sinun on koristettava koodi edelleen Cythonin mukautetulla syntaksilla.cimport Esimerkiksi lause antaa Cython-koodin nähdä kirjastojen C-tason rakenteita kääntöhetkellä mahdollisimman nopeita sidoksia varten.

Koska NumPy on niin laajalti käytetty, Cython tukee NumPyä "heti pakkauksesta". Jos NumPy on asennettu, voit vain ilmoittaacimport numero lisää koodiin ja lisää sitten koristelu käyttääksesi valotettuja toimintoja.

Cython-profilointi ja suorituskyky

Saat parhaan suorituskyvyn mistä tahansa koodikappaleesta profiloimalla se ja katsomalla omakohtaisesti pullonkaulat. Cython tarjoaa koukkuja Pythonin cProfile-moduulille, joten voit käyttää Pythonin omia profilointityökaluja, kuten cProfile, nähdäksesi, kuinka Cython-koodisi toimii.

Se auttaa muistaa kaikissa tapauksissa, että Cython ei ole taikuutta - että järkeviä todellisen suorituskyvyn käytäntöjä sovelletaan edelleen. Mitä vähemmän liikut edestakaisin Pythonin ja Cythonin välillä, sitä nopeammin sovelluksesi toimii.

Jos sinulla on esimerkiksi kokoelma esineitä, jotka haluat käsitellä Cythonissa, älä iteroi sitä Pythonissa ja kutsu Cython-toimintoa kussakin vaiheessa. Kulkea koko kokoelma Cython-moduuliin ja iteroida siellä. Tätä tekniikkaa käytetään usein kirjastoissa, jotka hallitsevat tietoja, joten se on hyvä malli jäljitellä omassa koodissasi.

Käytämme Pythonia, koska se tarjoaa ohjelmoijalle mukavuutta ja mahdollistaa nopean kehityksen. Joskus ohjelmoijan tuottavuus tulee maksamaan suorituskyvyn kustannuksella. Cythonilla vain pieni ylimääräinen vaivannäkö voi antaa sinulle molempien maailmojen parhaat puolet.

Lue lisää Pythonista

  • Mikä on Python? Tehokas, intuitiivinen ohjelmointi
  • Mikä on PyPy? Nopeampi Python ilman kipua
  • Mikä on Cython? Python nopeudella C
  • Cython-opetusohjelma: Kuinka nopeuttaa Pythonia
  • Kuinka asentaa Python älykkäästi
  • Python 3.8: n parhaat uudet ominaisuudet
  • Parempi Python-projektinhallinta Poetryn avulla
  • Virtualenv ja venv: Python-virtuaaliympäristöt selitetty
  • Python virtualenv ja venv do and don'ts
  • Python-ketjuttaminen ja aliprosessit on selitetty
  • Kuinka käyttää Python-virheenkorjainta
  • Kuinka käyttää timeit Python-koodin profilointiin
  • CProfilen käyttäminen Python-koodin profilointiin
  • Aloita asynkronointi Pythonissa
  • Asyncion käyttäminen Pythonissa
  • Kuinka muuntaa Python JavaScriptiksi (ja takaisin)
  • Python 2 EOL: Kuinka selvitä Python 2: n loppu
  • 12 pyytonia jokaiselle ohjelmointitarpeelle
  • 24 Python-kirjastoa jokaiselle Python-kehittäjälle
  • 7 suloista Python IDE: tä, jotka saatat olla unohtanut
  • 3 suurta Python-puutetta - ja niiden ratkaisut
  • 13 Python-verkkokehystä verrattiin
  • 4 Python-testikehystä vikojen murskaamiseksi
  • 6 upeaa uutta Python-ominaisuutta, joita et halua hukata
  • 5 Python-jakelua koneoppimisen hallitsemiseksi
  • 8 suurta Python-kirjastoa luonnollisen kielen käsittelyyn