Cython

Cython
Cython-logo.svg
Date de bază
Paradigme : multiparadigmatic
Anul publicării: 28 iulie 2007
Dezvoltator: Robert Bradshaw, Stefan Behnel și colab.
Versiunea actuală  0.29.21   (8 iulie 2020)
Tastare : puternic , static , dinamic („ tastarea rațelor ”)
Influențată de: Python , C , C ++
Sistem de operare : Linux , unix-like system
Licență : Licență Apache, versiunea 2.0, licență Apache
cython.org

Cython este un limbaj de programare universal care este în mare măsură compatibil cu Python . La fel ca acestea, suportă diverse paradigme de programare, cum ar fi programarea orientată pe obiecte , orientată pe aspect și funcțională . Principalul avantaj constă însă în traducerea în limba țintă C, care permite atât performanțe ridicate în comparație cu interpretul standard Python, cât și interacțiunea directă cu codul extern scris în C, C ++ sau Fortran .

Principalele aplicații sunt conectarea bibliotecilor externe la CPython - interpret , precum și accelerarea codului Python. Compilatorul Cython poate fi, de asemenea, utilizat pentru a compila module Python pure.

Codul generat nu este autosuficient, dar necesită un mediu de runtime compatibil cu CPython . Atât generarea de module binare („modul de extensie”), care pot fi importîncărcate dinamic în interpretorul Python prin intermediul comenzii, cât și integrarea linker-ului interpretului CPython în modulul generat, astfel încât un program executabil să fie creat ( încorporare ) .

Istoria dezvoltării

Cython se bazează pe Pyrex de Greg Ewing (publicat pentru prima dată pe 4 aprilie 2002). În iulie 2007, compilatorul Cython a fost separat de Pyrex de Robert Bradshaw și Stefan Behnel ca un proiect independent, deschis. De atunci, s-au încercat păstrarea celor două compilatoare în mare parte compatibile, deși Cython folosește optimizări de anvergură și realizează o compatibilitate mai mare cu codul Python. Diferențele importante față de Pyrex sunt descrise în documentația Cython.

Originea numelui

Numele Cython este un cuvânt valiză al celor două limbaje de programare subiacente: Python și C.

obiective

Proiectul Cython și-a stabilit obiectivul dezvoltării unui compilator pentru codul normal Python care să ofere cea mai înaltă performanță posibilă și o integrare extinsă cu codul scris în C, C ++ și Fortran prin tastare statică suplimentară (explicită).

Cython este un compilator de optimizare, dar nu în sensul obișnuit al unui compilator care generează cod binar . Mai degrabă, traducerea în cod C permite multe optimizări fundamentale și ajustări ale platformei să fie lăsate unui compilator C. Compilatorul Cython se poate astfel limita la optimizări la nivel înalt la nivel AST .

Codul C generat de Cython este în mare măsură portabil în ceea ce privește platformele (procesor, compilator C și sistemul de operare) și versiunile CPython. În prezent (versiunea 0.28.5) sunt acceptate versiunile CPython 2.6 și 2.7, precum și toate de la 3.3 pe. Platformele testate includ macOS , Windows și, mai presus de toate, diverse distribuții Linux cu versiuni de sistem pe 32 și 64 de biți .

caracteristici

Combinația dintre Python și C permite Cython să mapeze o gamă foarte largă de cerințe. Este posibilă atât programarea la nivel înalt cu tipuri de date Python, structuri de limbaj și gestionarea automată a memoriei, cât și programarea foarte apropiată de C cu tipuri de date C, funcții C și gestionarea manuală a memoriei. Ambele pot fi combinate după cum doriți, iar interacțiunea cu codul Python pur (necompilat) este la fel de nativ posibil ca interacțiunea cu codul C sau C ++, care permite o abordare foarte fină atunci când optimizați codul Cython. Orice parte a codului poate fi scrisă în Python pur, compilată cu Cython, optimizată cu tipuri de date statice sau chiar portată în C, în funcție de cerințe. În acest fel, Cython susține principiul că cea mai mare parte a timpului de rulare al unui program este creat într-o parte foarte mică a codului sursă , adică optimizarea unei părți mici a programului poate aduce un câștig foarte mare în performanță, în timp ce majoritatea codul necesită o viteză mare de dezvoltare și o întreținere redusă sunt mai importante decât cea mai mare viteză de execuție posibilă.

Limbajul de programare realizează integrarea limbajului între Python și C în principal prin tipuri de date. Diferite construcții de limbaj Python pot fi aplicate atât tipurilor de date Python, cât și tipurilor de date C. Un exemplu este bucla „for”, care este o buclă foreach în Python, adică poate rula peste orice container iterabil (de exemplu, liste sau fișiere). În Cython, această buclă poate rula, de asemenea, peste liste C ++, matrice C și subarrays, precum și peste secțiuni de pointer (felii, de ex. ptr[2:8]Pentru compensări 2-7). În plus, există o conversie automată între diferite tipuri de date Python și tipuri de date C, atât pentru tipurile scalare (numere), cât și pentru șirurile de caractere și tipurile de date structurate (de exemplu, tipurile C struct și dicționarele Python).

performanţă

Multe dintre optimizările efectuate de compilatorul Cython au ca rezultat automat o specializare a codului C generat. Pentru a face acest lucru, compilatorul folosește declarații explicite de tip static și inferență de tip (simplu) pentru a genera cod C specializat pentru tipurile de date utilizate și anumite modele de cod. O mare parte a optimizărilor din compilatorul Cython se referă la bucle, deoarece o mare parte din timpul total de rulare se acumulează de obicei aici.

Structurile de control (în special buclele) sunt de multe ori mai rapide traduse cu Cython și un compilator C decât atunci când sunt interpretate de CPython. Acest lucru se datorează optimizărilor optimiste și inferenței de tip. Aceasta înseamnă că codul Python compilat de Cython rulează de obicei mai repede decât în ​​CPython 2.6.x chiar și fără declarații explicite de tip, deși performanța relativă depinde în mod natural de codul în cauză. Datorită declarației statice a tipurilor de date și a specializării rezultate a codului C, totuși, se poate realiza de obicei o accelerație de mai multe ori. Mai ales în cazul calculelor matematice, îmbunătățirile în timpul rulării rezultă adesea cu un factor cuprins între o sută și o mie. În comparație, accelerația tipică prin intermediul compilatorului Python JIT Psyco este de aproximativ patru până la o sută de ori , cu PyPy în cazuri selectate de până la douăsprezece ori.

Codul generat de Cython pentru funcții este optimizat pentru despachetarea rapidă și conversia parametrilor de apel. Prin urmare, apelarea codului nativ către Python printr-un wrapper Cython este în general mai rapid decât în ​​alte implementări de wrapper pentru Python.

domenii de aplicare

Cele mai importante domenii de aplicare ale Cython sunt conectarea bibliotecilor externe la interpretorul CPython, precum și accelerarea codului Python, în special în calcule matematice și algoritmi intensivi din punct de vedere al calculului .

De exemplu, sistemul de algebră computerizată SageMath se bazează în mare parte pe codul Cython. Acesta este utilizat pentru a implementa algoritmi matematici, precum și pentru a lega coduri externe în C, C ++ și Fortran. Cython sprijină , de asemenea , o interacțiune foarte eficient cu NumPy - matrice , care pe baza acestor calcule foarte mult simplificate.

Biblioteca lxml de înaltă performanță XML este în mare parte implementată în Cython. Bibliotecile externe C libxml2 și libxslt sunt legate de interpretul Python.

Un alt exemplu din mediul de dezvoltare Cython Core este biblioteca MPI mpi4py. Conectează diverse implementări MPI la CPython.

Python Package Index conține o listă scurtă a altor biblioteci care sunt implementate în Cython.

Proiecte conexe și similare

  • Pyrex - predecesorul Cython
  • Swallow Unladen - mediu optimizat de execuție CPython; bazat pe LLVM
  • PyPy - Cadrul compilatorului JIT și timpul de execuție Python care este el însuși scris într-un dialect Python (RPython)
  • Psyco - compilator specializat JIT și optimizator de cod pentru mediul de execuție CPython
  • Shed Skin - limbaj de programare tipic Python, care este compilat conform C ++

Dovezi individuale

  1. Lansarea 0.29.21 . 8 iulie 2020 (accesat la 9 iulie 2020).
  2. github.com . (accesat la 2 februarie 2020).
  3. Cython: Extensii C pentru Python . (accesat la 8 iulie 2018).
  4. versiuni originale ale predecesorului Pyrex
  5. Compatibilitatea cu Python 2 este scopul declarat pentru viitoarea Cython versiunea 1.0 ( amintirea originalului de la 10 august 2011 în Internet Archive ) Info: Arhiva link - ul a fost introdus în mod automat și nu a fost încă verificată. Vă rugăm să verificați linkul original și arhivă conform instrucțiunilor și apoi eliminați această notificare. @ 1@ 2Șablon: Webachiv / IABot / wiki.cython.org
  6. felii pe docs.python.org, accesat pe 2 august 2018
  7. gmane.comp.python.cython.devel - comparație pybench între Cython și CPython 2.6.2
  8. gmane.comp.python.cython.devel - Trecerea de la un pointer Python ( memento al originalului din 14 februarie 2017 în Internet Archive ) Info: Arhiva link - ul a fost introdus în mod automat și nu a fost încă verificată. Vă rugăm să verificați linkul original și arhivă conform instrucțiunilor și apoi eliminați această notificare. @ 1@ 2Șablon: Webachiv / IABot / thread.gmane.org
  9. ^ Psyco - Introducere
  10. Viteza PyPy 1.4 comparativ cu CPython 2.6.2 cu / fără Psyco
  11. C ++ înveliș de referință pentru diverse Python înveliș generatoare (fără Cython) ( amintirea originalului din 04 aprilie 2015 în Internet Archive ) Info: Arhiva link - ul a fost introdus în mod automat și nu a fost încă verificată. Vă rugăm să verificați linkul original și arhivă conform instrucțiunilor și apoi eliminați această notificare. @ 1@ 2Șablon: Webachiv / IABot / telecom.inescporto.pt
  12. Etaloane de referință C ++ pentru Cython, Boost.Python și PyBindGen
  13. Lista pachetelor Python implementate în Cython pe PyPI