Programovanie

Čo je to Cython? Python rýchlosťou C

Python má povesť jedného z najpohodlnejších, bohato vybavených a vyslovene užitočných programovacích jazykov. Rýchlosť vykonávania? Nie veľmi.

Zadajte Cython. Jazyk Cython je nadmnožinou jazyka Python, ktorý sa kompiluje do jazyka C a poskytuje zvýšenie výkonu, ktoré sa môže pohybovať od niekoľkých percent do niekoľkých rádov, v závislosti od konkrétnej úlohy. Pre prácu, ktorá je viazaná na natívne typy objektov Pythonu, nebudú zrýchlenia veľké. Ale pre numerické operácie alebo akékoľvek operácie, ktoré nezahŕňajú vlastné interné prvky Pythonu, môžu byť zisky obrovské.

S Cythonom môžete obísť mnohé z natívnych obmedzení Pythonu alebo ich úplne prekonať - bez toho, aby ste sa museli vzdať Pythonovej ľahkosti a pohodlia. V tomto článku si ukážeme základné koncepty, ktoré stoja za Cythonom, a vytvoríme jednoduchú aplikáciu v jazyku Python, ktorá pomocou Cythonu urýchľuje jednu zo svojich funkcií.

Súvisiace video: Používanie Cythonu na zrýchlenie Pythonu

Zkompilujte Python do C.

Kód v jazyku Python môže uskutočňovať hovory priamo do modulov C. Týmito modulmi C môžu byť buď všeobecné knižnice C, alebo knižnice vytvorené špeciálne na prácu s Pythonom. Cython generuje druhý druh modulu: C knižnice, ktoré komunikujú s vnútornými priestormi Pythonu a ktoré môžu byť dodávané s existujúcim kódom Pythonu.

Kód Cython vyzerá dizajnovo veľmi podobne ako kód Python. Ak nahráte kompilátor Cython programom Python (Python 2.x a Python 3.x sú podporované), Cython ho prijme taký, aký je, ale žiadna z natívnych akcelerácií Cythonu nebude platiť. Ale ak ozdobíte kód Pythonu anotáciami typov v špeciálnej syntaxi Cythonu, bude Cython schopný nahradiť rýchle ekvivalenty C za pomalé objekty Pythonu.

Upozorňujeme, že prístup spoločnosti Cython jeprírastkové. To znamená, že vývojár môže začať sexistujúce Aplikácia Python a urýchlite ju vykonaním okamžitých zmien v kóde, namiesto prepisovania celej aplikácie od základu.

Tento prístup zapadá do povahy problémov s výkonom softvéru všeobecne. Vo väčšine programov je drvivá väčšina kódu náročného na procesor sústredená na niekoľko aktívnych miest - verzia Paretovho princípu, tiež známa ako pravidlo „80/20“. Väčšina kódu v aplikácii Python teda nemusí byť optimalizovaná z hľadiska výkonu, stačí niekoľko kritických častí. Tieto aktívne miesta môžete postupne preložiť do jazyka Cython a dosiahnuť tak potrebné zvýšenie výkonu tam, kde to najviac záleží. Zvyšok programu môže pre pohodlie vývojárov zostať v Pythone.

Ako používať Cython

Zvážte nasledujúci kód prevzatý z dokumentácie spoločnosti Cython:

def f (x):

návrat x ** 2-x

def integrate_f (a, b, N):

s = 0

dx = (b-a) / N

pre i v rozsahu (N):

s + = f (a + i * dx)

návrat s * dx

Toto je príklad hračky, nie príliš efektívna implementácia integrálnej funkcie. Ako čistý kód v jazyku Python je pomalý, pretože Python musí prevádzať medzi počítačovými natívnymi numerickými typmi a vlastnými internými typmi objektov.

Teraz zvážte verziu rovnakého kódu pre Cython, ktorej podčiarknuté doplnky sú:

 cdef double f (double x):

návrat x ** 2-x

def integrate_f (dvojité a, dvojité b, int N):

cdef int i

cdef double s, x, dx

s = 0

dx = (b-a) / N

pre i v rozsahu (N):

s + = f (a + i * dx)

návrat s * dx

Ak výslovne deklarujeme typy premenných, tak pre parametre funkcie, ako aj pre premenné použité v tele funkcie (dvojitý, int, atď.), Cython toto všetko preloží do jazyka C. Môžeme tiež použiť znak cdef kľúčové slovo na definovanie funkcií, ktoré sú implementované primárne v C pre vyššiu rýchlosť, aj keď tieto funkcie môžu byť volané iba inými funkciami Cythonu a nie skriptmi Pythonu. (Vo vyššie uvedenom príklade iba integrovať_f možno volať iným skriptom Pythonu.)

Všimnite si, ako málo je naše skutočnékód zmenila. Všetko, čo sme urobili, je pridanie deklarácií typov do existujúceho kódu, aby sa dosiahlo výrazné zvýšenie výkonu.

Výhody Cythonu

Okrem schopnosti urýchliť kód, ktorý ste už napísali, poskytuje Cython niekoľko ďalších výhod:

Práca s externými knižnicami C môže byť rýchlejšia

Balíky Pythonu ako NumPy zabaľujú knižnice C do rozhraní Pythonu, aby sa s nimi dalo ľahko pracovať. Avšak prechádzanie medzi Pythonom a C cez tieto obaly môže veci spomaliť. Cython vám umožňuje hovoriť so základnými knižnicami priamo, bez Pythonu. (Podporované sú aj knižnice C ++.)

Môžete použiť správu pamäte C aj Python

Ak používate objekty Pythonu, sú spravované pamäťou a zhromažďované rovnako ako v bežnom Pythone. Ale ak chcete vytvoriť a spravovať svoje vlastné štruktúry na úrovni C, použite malloc/zadarmo aby ste s nimi mohli pracovať, môžete tak urobiť. Len nezabudnite upratať po sebe.

Podľa potreby sa môžete rozhodnúť pre bezpečnosť alebo rýchlosť

Cython automaticky vykonáva kontroly runtime bežných problémov, ktoré sa objavia v C, ako je napríklad prístup mimo poľa v poli, prostredníctvom dekorátorov a smerníc kompilátora (napr. @boundscheck (False)). Následne je C kód generovaný Cythonom štandardne omnoho bezpečnejší ako ručne valcovaný C kód, aj keď potenciálne za cenu surového výkonu.

Ak ste si istí, že tieto kontroly nebudete potrebovať, môžete ich pre ďalšie zvýšenie rýchlosti deaktivovať, a to buď v rámci celého modulu, alebo iba vo vybraných funkciách.

Cython vám tiež umožňuje natívny prístup k štruktúram Pythonu, ktoré používajú protokol medzipamäte na priamy prístup k údajom uloženým v pamäti (bez medzikrokovania). Zobrazenie pamäte Cython vám umožní pracovať s týmito štruktúrami vysokou rýchlosťou a úrovňou bezpečnosti zodpovedajúcou úlohe. Napríklad nespracované údaje, ktoré sú základom reťazca Pythonu, je možné načítať týmto spôsobom (rýchlo) bez toho, aby ste museli prechádzať behom Pythonu (pomaly).

Vydanie GIL môže mať prospech z kódu Cython C

Globálny tlmočník Lock alebo GIL spoločnosti Python synchronizuje vlákna v rámci tlmočníka, čím chráni prístup k objektom Python a riadi spory o zdroje. Ale GIL bol všeobecne kritizovaný ako kameň úrazu lepšie fungujúceho Pythonu, najmä na viacjadrových systémoch.

Ak máte časť kódu, ktorá neodkazuje na objekty Pythonu a vykonáva dlhodobú operáciu, môžete ju označiť pomocous nogilom: smernice umožňujúce jeho prevádzku bez GIL. Toto uvoľní tlmočníka Pythonu robiť ďalšie veci a umožní kódu Cython využívať viac jadier (s ďalšou prácou).

Cython môže používať syntax naznačovania typu Python

Python má syntax naznačovania typov, ktorú používajú skôr interintery a kontroly kódu, ako tlmočník CPython. Cython má svoju vlastnú syntax pre dekorácie kódu, ale s nedávnymi revíziami Cythonu môžete použiť syntax naznačenia typu Pythonu aj na poskytnutie základných tipov pre Cython.

Cython možno použiť na zakrytie citlivého kódu v jazyku Python

Pythonové moduly sa dajú triviálne ľahko dekompilovať a skontrolovať, ale kompilované binárne súbory nie. Ak chcete pri distribúcii aplikácie v jazyku Python koncovým používateľom chrániť niektoré z jej modulov pred náhodným sledovaním, môžete to urobiť tak, že ich skompilujete s programom Cython. Toto je však vedľajší účinok schopností Cythonu, ani jedna z jeho zamýšľaných funkcií.

Cythonské obmedzenia

Pamätajte, že Cython nie je čarovná palička. Nezmení automaticky každú inštanciu starostlivo pripraveného kódu Pythonu na prchavý C kód. Ak chcete Cython využiť naplno, musíte ho používať s rozumom - a rozumieť jeho obmedzeniam:

Malé zrýchlenie pre konvenčný kód v jazyku Python

Keď Cython narazí na kód v Pythone, nemôže ho preložiť úplne do jazyka C, transformuje tento kód na sériu volaní jazyka C do vnútorných priestorov Pythonu. To znamená vyňatie tlmočníka Pythonu z vykonávacej slučky, čo predvolene poskytuje kódu skromné ​​zrýchlenie o 15 až 20 percent. Toto je najlepší prípad; v niektorých situáciách nemusí dôjsť k zlepšeniu výkonu alebo dokonca k zníženiu výkonu.

Malé zrýchlenie natívnych dátových štruktúr Pythonu

Python poskytuje množstvo dátových štruktúr - reťazce, zoznamy, n-tice, slovníky atď. Sú veľmi výhodné pre vývojárov a prichádzajú s vlastnou automatickou správou pamäte. Ale sú pomalšie ako čisté C.

Cython vám umožňuje naďalej používať všetky dátové štruktúry Pythonu, aj keď bez veľkého zrýchlenia. Je to tak opäť preto, lebo Cython jednoducho volá C API za behu Pythonu, ktoré tieto objekty vytvárajú a manipulujú s nimi. Dátové štruktúry Pythonu sa teda správajú podobne ako Python kód optimalizovaný pre Cython: Spravidla získate podporu, ale len trochu. Najlepšie výsledky dosiahnete, keď použijete premenné a štruktúry C. Dobrou správou je, že Cython s nimi uľahčuje prácu.

Cythonský kód beží najrýchlejšie, keď je „čistý C“

Ak máte funkciu v jazyku C označenú značkou cdef kľúčové slovo so všetkými jeho premennými a volanými funkčnými volaniami na iné veci, ktoré sú čistým C, bude bežať tak rýchlo, ako to len pôjde. Ak ale táto funkcia odkazuje na akýkoľvek natívny kód v Pythone, napríklad na dátovú štruktúru Pythonu alebo volanie interného rozhrania Python API, bude toto volanie úzkym miestom výkonu.

Našťastie Cython poskytuje spôsob, ako zistiť tieto úzke miesta: správa o zdrojovom kóde, ktorá na prvý pohľad ukáže, ktoré časti vašej aplikácie Cython sú čisté C a ktoré časti interagujú s Pythonom. Čím lepšie bude aplikácia optimalizovaná, tým menej bude interakcie s Pythonom.

Cython NumPy

Cython vylepšuje použitie knižníc tretích strán založených na C, ako je NumPy. Pretože sa kód v jazyku Cython kompiluje do jazyka C, môže interagovať s týmito knižnicami priamo a vyradiť tak Pythonove prekážky zo slučky.

Ale hlavne NumPy funguje dobre s Cythonom. Cython má natívnu podporu pre konkrétne konštrukcie v NumPy a poskytuje rýchly prístup k poliam NumPy. A rovnaká známa syntax NumPy, ktorú by ste použili v konvenčnom skripte Python, sa dá použiť v Cythone tak, ako je.

Ak však chcete vytvoriť čo najbližšie väzby medzi programami Cython a NumPy, musíte kód ďalej ozdobiť vlastnou syntaxou produktu Cython. Thecimport príkaz napríklad umožňuje kódu Cython vidieť konštrukty na úrovni C v knižniciach v čase kompilácie, aby sa dosiahli čo najrýchlejšie väzby.

Pretože je NumPy veľmi rozšírený, Cython podporuje NumPy „po vybalení z krabice“. Ak máte NumPy nainštalovaný, stačí uviesťcimport numpy vo svojom kóde, potom pridajte ďalšie dekorácie, aby ste mohli použiť exponované funkcie.

Cythonské profilovanie a výkon

Najlepší výkon z ktorejkoľvek časti kódu získate jeho profilovaním a priamym zistením, kde sú úzke miesta. Cython poskytuje háčiky pre modul cProfile v Pythone, takže môžete použiť vlastné profilové nástroje Pythonu, ako je cProfile, aby ste videli, ako funguje váš kód v Cythone.

Vo všetkých prípadoch si treba uvedomiť, že Cython nie je kúzlo - že v praxi stále platia rozumné postupy týkajúce sa výkonu. Čím menej budete prechádzať medzi Pythonom a Cythonom, tým rýchlejšie bude vaša aplikácia bežať.

Napríklad, ak máte zbierku objektov, ktoré chcete spracovať v Cythone, nepererujte ju v Pythone a v každom kroku vyvolajte Cythonovu funkciu. Prejdite celú zbierku do svojho modulu Cython a iterujte tam. Táto technika sa často používa v knižniciach, ktoré spravujú údaje, takže je to dobrý model na napodobňovanie vo vašom vlastnom kóde.

Používame Python, pretože poskytuje pohodlie programátora a umožňuje rýchly vývoj. Produktivita tohto programátora niekedy stojí za cenu výkonu. S Cythonom vám len trochu viac úsilia môže poskytnúť to najlepšie z oboch svetov.

Prečítajte si viac o Pythone

  • Čo je to Python? Výkonné a intuitívne programovanie
  • Čo je to PyPy? Rýchlejší Python bez bolesti
  • Čo je to Cython? Python rýchlosťou C
  • Výukový program pre Cython: Ako zrýchliť Python
  • Ako inteligentne nainštalovať Python
  • Najlepšie nové funkcie v Pythone 3.8
  • Lepšie riadenie projektov v Pythone s Poetry
  • Virtualenv a venv: Vysvetlenie virtuálnych prostredí Pythonu
  • Python virtualenv a venv robí a nerobí
  • Vysvetlenie vlákien a podprocesov v jazyku Python
  • Ako používať debugger Pythonu
  • Ako používať timeit na profilovanie kódu Pythonu
  • Ako používať cProfile na profilovanie kódu Pythonu
  • Začnite s asynchronizáciou v Pythone
  • Ako používať asyncio v Pythone
  • Ako previesť Python na JavaScript (a späť)
  • Python 2 EOL: Ako prežiť koniec Pythonu 2
  • 12 pytónov pre každú potrebu programovania
  • 24 knižníc Pythonu pre každého vývojára Pythonu
  • Sedem sladkých IDE Pythonu, ktoré vám mohli chýbať
  • 3 hlavné nedostatky Pythonu - a ich riešenia
  • 13 porovnávaných webových rámcov Pythonu
  • 4 testovacie rámce Pythonu na rozdrvenie vašich chýb
  • 6 skvelých nových funkcií Pythonu, ktoré vám určite nebudú chýbať
  • 5 distribúcií Pythonu na zvládnutie strojového učenia
  • 8 skvelých knižníc Pythonu na spracovanie prirodzeného jazyka
$config[zx-auto] not found$config[zx-overlay] not found