Programmēšana

Kas ir Cython? Python ar ātrumu C

Python ir reputācija kā viena no ērtākajām, bagātīgāk aprīkotajām un tieši noderīgajām programmēšanas valodām. Izpildes ātrums? Ne tik daudz.

Ievadiet Cython. Cython valoda ir Python virsgrupa, kas apkopo C, nodrošinot veiktspējas palielinājumus, kas var svārstīties no dažiem procentiem līdz vairākām lieluma pakāpēm, atkarībā no veicamā uzdevuma. Darbiem, kurus saista Python vietējie objektu tipi, ātrumu palielināšana nebūs liela. Bet skaitliskām operācijām vai jebkurām darbībām, kurās nav iesaistīti paša Python iekšējie, ieguvumi var būt milzīgi.

Izmantojot Cython, jūs varat nošķirt daudzus Python vietējos ierobežojumus vai pilnībā tos pārkāpt, neatmetot Python vieglumu un ērtības. Šajā rakstā mēs iepazīsimies ar Cython pamatjēdzieniem un izveidosim vienkāršu Python lietojumprogrammu, kas izmanto Cython, lai paātrinātu vienu no tās funkcijām.

Saistītais videoklips: Cython izmantošana, lai paātrinātu Python

Kompilējiet Python uz C

Python kods var veikt zvanus tieši C moduļos. Šie C moduļi var būt vai nu vispārīgas C bibliotēkas, vai bibliotēkas, kas īpaši izveidotas darbam ar Python. Cython ģenerē otrā veida moduli: C bibliotēkas, kas runā ar Python iekšējiem elementiem un kuras var apvienot ar esošo Python kodu.

Pēc konstrukcijas Cython kods izskatās ļoti līdzīgs Python kodam. Ja jūs padodat Cython kompilatoru Python programmai (tiek atbalstīti gan Python 2.x, gan Python 3.x), Cython to pieņems tādu, kāds tas ir, taču neviens no Cython vietējiem paātrinājumiem netiks rādīts. Bet, ja jūs izrotājat Python kodu ar tipa anotācijām Cython īpašajā sintaksē, Cython varēs aizstāt ātrus C ekvivalentus ar lēniem Python objektiem.

Ņemiet vērā, ka Cython pieeja irpapildu. Tas nozīmē, ka izstrādātājs var sākt aresošie Python lietojumprogrammu un paātriniet to, veicot koda izmaiņas uz vietas, nevis pārrakstot visu lietojumprogrammu no pamatiem.

Šī pieeja atbilst programmatūras veiktspējas problēmu būtībai kopumā. Lielākajā daļā programmu centrālā procesora ietilpīgā koda lielākā daļa ir koncentrēta dažos karstajos punktos - Pareto principa versija, kas pazīstama arī kā “80/20” kārtula. Tādējādi lielākajai daļai Python lietojumprogrammas koda nav jābūt optimizētam, tikai daži kritiski gabali. Jūs varat pakāpeniski pārtulkot šos karstos punktus Cython, tādējādi iegūstot nepieciešamo veiktspējas pieaugumu tur, kur tas ir vissvarīgākais. Pārējā programma izstrādātāju ērtībām var palikt Python.

Kā izmantot Cython

Apsveriet šo kodu, kas ņemts no Cython dokumentācijas:

def f (x):

atgriešanās x ** 2-x

def integrēt_f (a, b, N):

s = 0

dx = (b-a) / N

i diapazonā (N):

s + = f (a + i * dx)

atgriešanās s * dx

Šis ir rotaļlietu piemērs, kas nav ļoti efektīva integrālās funkcijas ieviešana. Kā tīrs Python kods tas ir lēns, jo Python ir jāpārveido turp un atpakaļ starp mašīndzimto ciparu tipiem un saviem iekšējiem objektu tipiem.

Tagad apsveriet tā paša koda Cython versiju, pasvītrojot Cython papildinājumus:

 cdef double f (dubultā x):

atgriešanās x ** 2-x

def integrēt_f (dubultā a, dubultā b, int N):

cdef int i

cdef dubultā s, x, dx

s = 0

dx = (b-a) / N

i diapazonā (N):

s + = f (a + i * dx)

atgriešanās s * dx

Ja mēs skaidri deklarējam mainīgo tipus gan funkcijas parametriem, gan mainīgajiem, kas tiek izmantoti funkcijas pamattekstā (dubultā, intutt.), Cython to visu pārtulkos C. Mēs varam izmantot arī cdef atslēgvārds, lai definētu funkcijas, kas papildu ātrumam tiek ieviestas galvenokārt C, lai gan šīs funkcijas var izsaukt tikai citas Cython funkcijas, nevis Python skripti. (Tikai iepriekš minētajā piemērā integrēt_f var izsaukt ar citu Python skriptu.)

Ievērojiet, cik maz mūsu faktiskaiskods ir mainījies. Viss, ko esam paveikuši, ir esošajam kodam pievienot tipa deklarācijas, lai iegūtu ievērojamu veiktspējas palielinājumu.

Cython priekšrocības

Papildus spējai paātrināt jau uzrakstīto kodu, Cython piešķir vairākas citas priekšrocības:

Darbs ar ārējām C bibliotēkām var būt ātrāks

Python paketes, piemēram, NumPy, iesaiņo C bibliotēkas Python saskarnēs, lai ar tām būtu viegli strādāt. Tomēr, pārejot uz priekšu un atpakaļ starp Python un C caur šiem iesaiņotājiem, lietas var palēnināties. Cython ļauj jums tieši sarunāties ar pamatā esošajām bibliotēkām, bez Python. (Tiek atbalstītas arī C ++ bibliotēkas.)

Varat izmantot gan C, gan Python atmiņas pārvaldību

Ja izmantojat Python objektus, tie tiek pārvaldīti atmiņā un atkritumi tiek savākti tāpat kā parastajā Python. Bet, ja vēlaties izveidot un pārvaldīt savas C līmeņa struktūras un izmantot malloc/bez maksas strādāt ar viņiem, jūs varat to izdarīt. Vienkārši atcerieties sakopt pēc sevis.

Pēc vajadzības varat izvēlēties drošību vai ātrumu

Cython, izmantojot dekoratorus un kompilatoru direktīvas, automātiski veic izpildlaika pārbaudes, lai pārbaudītu bieži sastopamās problēmas, kas rodas C, piemēram, ārpus masīva pieeja masīvam (piem., @boundscheck (False)). Līdz ar to Cython ģenerētais C kods pēc noklusējuma ir daudz drošāks nekā ar roku velmēts C kods, lai arī potenciāli par neapstrādātas veiktspējas cenu.

Ja esat pārliecināts, ka šīs pārbaudes jums nebūs vajadzīgas izpildes laikā, varat tās atspējot, lai iegūtu papildu ātruma palielināšanas iespējas vai nu visā modulī, vai tikai atsevišķām funkcijām.

Cython ļauj arī dabiski piekļūt Python struktūrām, kas izmanto buferprotokolu, lai tieši piekļūtu atmiņā saglabātajiem datiem (bez starpkopēšanas). Cython atmiņas ļauj jums strādāt ar šīm konstrukcijām lielā ātrumā un ar uzdevumam atbilstošu drošības līmeni. Piemēram, neapstrādātus datus, kas ir Python virknes pamatā, var lasīt šādā veidā (ātri), neizmantojot Python izpildlaiku (lēni).

Cython C kods var būt noderīgs, atbrīvojot GIL

Python's Global Interpreter Lock jeb GIL sinhronizē tulkus tulkos, aizsargājot piekļuvi Python objektiem un pārvaldot resursu konkurenci. Bet GIL ir plaši kritizēts kā klupšanas akmens labāk darbojošam Python, it īpaši daudzkodolu sistēmās.

Ja jums ir koda sadaļa, kurā nav atsauces uz Python objektiem un kas veic ilgstošu darbību, varat to atzīmēt arar nogil: direktīvu, kas ļautu tai darboties bez GIL. Tas atbrīvo Python tulku citu darbību veikšanai un ļauj Cython kodam izmantot vairākus kodolus (ar papildu darbu).

Cython var izmantot Python tipa mājienu sintaksi

Python ir sintakses veids, kas norāda uz tipu, ko galvenokārt izmanto tekstra un kodu pārbaudītāji, nevis CPython tulks. Cython ir sava pielāgotā sintakse kodu rotājumiem, taču ar jaunākajām Cython versijām varat izmantot Python tipa norādījumu sintaksi, lai sniegtu pamata tipa padomus arī Cython.

Cython var izmantot, lai aizsegtu sensitīvu Python kodu

Python moduļus ir niecīgi viegli dekompilēt un pārbaudīt, bet apkopotos bināros failus tā nav. Izplatot Python lietojumprogrammu galalietotājiem, ja vēlaties dažus tās moduļus pasargāt no gadījuma snoopēšanas, varat to izdarīt, apkopojot tos ar Cython. Tomēr ņemiet vērā, ka tas ir blakusefekts no Cython iespējām, nevis viena no paredzētajām funkcijām.

Cython ierobežojumi

Paturiet prātā, ka Cython nav burvju nūjiņa. Tas automātiski nepārvērš katru mainīgā Python koda gadījumu par ātri čīkstošu C kodu. Lai maksimāli izmantotu Cython, jums tas jālieto saprātīgi un jāizprot tā ierobežojumi:

Neliels paātrinājums parastajam Python kodam

Kad Cython sastop Python kodu, to nevar pilnībā pārtulkot C, tas pārveido šo kodu par C zvanu virkni uz Python iekšējiem. Tas nozīmē, ka Python tulks tiek izņemts no izpildes cilpas, kas kodam pēc noklusējuma dod nelielu 15 līdz 20 procentu ātrumu. Ņemiet vērā, ka tas ir labākais scenārijs; dažās situācijās jūs, iespējams, neredzat veiktspējas uzlabošanos vai pat veiktspējas pasliktināšanos.

Mazs ātrums vietējām Python datu struktūrām

Python nodrošina virkni datu struktūru - virknes, sarakstus, rindkopas, vārdnīcas un tā tālāk. Tie ir ļoti ērti izstrādātājiem, un tiem ir sava automātiskā atmiņas pārvaldība. Bet tie ir lēnāki nekā tīrs C.

Cython ļauj turpināt izmantot visas Python datu struktūras, lai arī bez lielas paātrināšanas. Tas atkal notiek tāpēc, ka Cython Python izpildlaikā vienkārši izsauc C API, kas rada un manipulē ar šiem objektiem. Tādējādi Python datu struktūras darbojas līdzīgi kā parasti ar Cython optimizēto Python kodu: Dažreiz jūs saņemat stimulu, bet tikai nedaudz. Lai iegūtu labākos rezultātus, izmantojiet C mainīgos un struktūras. Labā ziņa ir tā, ka Cython atvieglo darbu ar viņiem.

Cython kods visātrāk darbojas, ja “tīrs C”

Ja jums ir funkcija C, kas apzīmēta ar cdef atslēgvārds ar visiem tā mainīgajiem un iekšējiem funkciju izsaukumiem uz citām lietām, kas ir tīrs C, tas darbosies tik ātri, cik var C. Bet, ja šī funkcija atsaucas uz jebkuru Python vietējo kodu, piemēram, Python datu struktūru vai izsaukumu uz iekšēju Python API, šis zvans būs veiktspējas sašaurinājums.

Par laimi, Cython nodrošina veidu, kā pamanīt šīs vājās vietas: pirmkodu pārskatu, kas īsumā parāda, kuras jūsu Cython lietotnes daļas ir tīras C un kuras daļas mijiedarbojas ar Python. Jo labāk tiks optimizēta lietotne, jo mazāka būs mijiedarbība ar Python.

Cython NumPy

Cython uzlabo C balstītu trešo pušu numuru kratīšanas bibliotēku, piemēram, NumPy, izmantošanu. Tā kā Cython kods kompilējas uz C, tas var tieši mijiedarboties ar šīm bibliotēkām un izņemt Python's vājās vietas.

Bet jo īpaši NumPy labi darbojas ar Cython. Cython nodrošina vietējo atbalstu īpašām NumPy konstrukcijām un nodrošina ātru piekļuvi NumPy masīviem. To pašu pazīstamo NumPy sintaksi, kuru izmantosit parastajā Python skriptā, var izmantot arī Cython.

Tomēr, ja vēlaties izveidot pēc iespējas tuvākas saites starp Cython un NumPy, kods ir jāturpina izrotāt ar Cython pielāgoto sintaksi. Thecimport Piemēram, paziņojums ļauj Cython kodam kompilācijas laikā redzēt C līmeņa konstrukcijas bibliotēkās pēc iespējas ātrākai sasaistei.

Tā kā NumPy ir tik plaši izmantots, Cython atbalsta NumPy “ārpus kastes”. Ja jums ir instalēts NumPy, varat vienkārši norādītcimport numpy kodā, pēc tam pievienojiet papildu apdari, lai izmantotu eksponētās funkcijas.

Cython profilēšana un veiktspēja

Jūs iegūstat vislabāko veiktspēju no jebkura koda fragmenta, to profilējot un no pirmavotiem redzot, kur atrodas vājās vietas. Cython nodrošina āķus Python's cProfile modulim, lai jūs varētu izmantot paša Python profilēšanas rīkus, piemēram, cProfile, lai redzētu, kā darbojas jūsu Cython kods.

Visos gadījumos palīdz atcerēties, ka Cython nav maģija - ka joprojām tiek piemērota saprātīga reālās darbības veiktspējas prakse. Jo mazāk jūs turp un atpakaļ pārvietojat starp Python un Cython, jo ātrāk darbosies jūsu lietotne.

Piemēram, ja jums ir objektu kolekcija, ko vēlaties apstrādāt Cython, nelieciniet par to Python un katrā solī neizsauciet funkciju Cython. Pass visa kolekcija uz savu Cython moduli un tur atkārtojiet. Šo paņēmienu bieži izmanto bibliotēkās, kas pārvalda datus, tāpēc tas ir labs modelis, ko atdarināt savā kodā.

Mēs izmantojam Python, jo tas nodrošina programmētāja ērtības un ļauj ātri attīstīties. Dažreiz šī programmētāja produktivitāte ir saistīta ar veiktspējas cenu. Izmantojot Cython, tikai nedaudz papildu piepūles var dot vislabāko no abām pasaulēm.

Lasiet vairāk par Python

  • Kas ir Python? Jaudīga, intuitīva programmēšana
  • Kas ir PyPy? Ātrāks Python bez sāpēm
  • Kas ir Cython? Python ar ātrumu C
  • Cython apmācība: kā paātrināt Python
  • Kā instalēt Python viedajā veidā
  • Labākās Python 3.8 jaunās funkcijas
  • Labāka Python projektu vadība ar dzeju
  • Virtualenv un venv: paskaidrotas virtuālās Python vides
  • Python virtualenv un venv do's un don'ts
  • Paskaidrots Python vītne un apakšprocesi
  • Kā izmantot Python atkļūdotāju
  • Kā izmantot Timeit, lai profilētu Python kodu
  • Kā izmantot cProfile Python koda profilēšanai
  • Sāciet darbu ar asinhronizāciju Python
  • Kā lietot asyncio Python
  • Kā konvertēt Python uz JavaScript (un atkal atpakaļ)
  • Python 2 EOL: kā izdzīvot Python 2 beigās
  • 12 pitoni visām programmēšanas vajadzībām
  • 24 Python bibliotēkas katram Python izstrādātājam
  • 7 saldie Python IDE, kurus jūs varētu palaist garām
  • 3 galvenie Python trūkumi un to risinājumi
  • Salīdzināti 13 Python tīmekļa ietvari
  • 4 Python testa ietvari, lai iznīcinātu jūsu kļūdas
  • 6 lieliskas jaunas Python funkcijas, kuras nevēlaties palaist garām
  • 5 Python izplatījumi mašīnmācīšanās apgūšanai
  • 8 lieliskas Python bibliotēkas dabiskās valodas apstrādei
$config[zx-auto] not found$config[zx-overlay] not found