Cython

Cython
Cython-logo.svg
Dati di base
Paradigmi : multi-paradigmatico
Anno di pubblicazione: 28 luglio 2007
Sviluppatore: Robert Bradshaw, Stefan Behnel, et al.
Versione attuale  0.29.21   (8 luglio 2020)
Digitazione : forte , statico , dinamico (" dattilografia ")
Influenzato da: Python , C , C ++
Sistema operativo : Linux , un sistema simile a unix
Licenza : Licenza Apache, versione 2.0, licenza Apache
cython.org

Cython è un linguaggio di programmazione universale ampiamente compatibile con Python . Come questi, supporta diversi paradigmi di programmazione come orientato agli oggetti , orientata agli aspetti e funzionale programmazione. Il vantaggio principale, tuttavia, risiede nella traduzione nel linguaggio di destinazione C, che consente sia prestazioni elevate rispetto all'interprete Python standard, sia l'interazione diretta con codice esterno scritto in C, C ++ o Fortran .

Le applicazioni principali sono il collegamento di esterni biblioteche al CPython - interprete , così come l'accelerazione di codice Python. Il compilatore Cython può essere utilizzato anche per compilare moduli Python puri.

Il codice generato non è autosufficiente, ma richiede un ambiente di runtime compatibile con CPython . Sia la generazione di moduli binari ("modulo di estensione"), che possono essere importcaricati dinamicamente nell'interprete Python utilizzando il comando, e l'integrazione del linker dell'interprete CPython nel modulo generato, in modo che un eseguibile Il programma viene creato ( incorporamento ).

Storia dello sviluppo

Cython è basato su Pyrex di Greg Ewing (pubblicato per la prima volta il 4 aprile 2002). Nel luglio 2007, il compilatore Cython è stato separato da Pyrex da Robert Bradshaw e Stefan Behnel come progetto indipendente e apertamente sviluppato. Da allora, sono stati fatti tentativi per mantenere i due compilatori ampiamente compatibili, sebbene Cython utilizzi ottimizzazioni di vasta portata e raggiunga una maggiore compatibilità con il codice Python. Importanti differenze con Pyrex sono descritte nella documentazione di Cython.

Origine del nome

Il nome Cython è una parola valigia dei due linguaggi di programmazione sottostanti: Python e C.

obiettivi

Il progetto Cython si è posto l'obiettivo di sviluppare un compilatore per il normale codice Python che offra le massime prestazioni possibili e un'ampia integrazione con il codice scritto in C, C ++ e Fortran attraverso la digitazione statica aggiuntiva (esplicita).

Cython è un compilatore ottimizzante, ma non nel senso usuale di un compilatore che genera codice binario . Piuttosto, la traduzione in codice C consente di lasciare molte ottimizzazioni fondamentali e aggiustamenti della piattaforma a un compilatore C. Il compilatore Cython può quindi limitarsi a ottimizzazioni di alto livello a livello AST .

Il codice C generato da Cython è ampiamente portabile in termini di piattaforme (processore, compilatore C e sistema operativo) e versioni CPython. Attualmente (versione 0.28.5) sono supportate le versioni 2.6 e 2.7 di CPython e tutte le versioni dalla 3.3 in poi. Le piattaforme testate includono macOS , Windows e, soprattutto, varie distribuzioni Linux con versioni di sistema a 32 bit e 64 bit .

caratteristiche

La combinazione di Python e C consente a Cython di mappare una gamma molto ampia di requisiti. È possibile sia la programmazione di alto livello con tipi di dati Python, costrutti di linguaggio e gestione automatica della memoria, sia la programmazione molto simile a C con tipi di dati C, funzioni C e gestione manuale della memoria. Entrambi possono essere combinati a piacere e l'interazione con il codice Python puro (non compilato) è altrettanto nativamente possibile quanto l'interazione con il codice C o C ++, che consente un approccio molto fine durante l'ottimizzazione del codice Cython. Qualsiasi parte del codice può essere scritta in puro Python, compilato con Cython, ottimizzato con tipi di dati statici o anche portato in C, a seconda dei requisiti. In questo modo, Cython supporta il principio che la maggior parte del runtime di un programma viene creato in una piccolissima parte del codice sorgente , ovvero l'ottimizzazione di una piccola parte del programma può portare un grandissimo guadagno di prestazioni, mentre per la maggior parte del codice un'elevata velocità di sviluppo e un requisiti di manutenzione ridotti sono più importanti della massima velocità di esecuzione possibile.

Il linguaggio di programmazione raggiunge l'integrazione linguistica tra Python e C principalmente attraverso i tipi di dati. È possibile applicare diversi costrutti del linguaggio Python sia ai tipi di dati Python che ai tipi di dati C. Un esempio è il ciclo 'for', che è un ciclo foreach in Python, cioè può essere eseguito su qualsiasi contenitore iterabile (ad esempio elenchi o file). In Cython, questo ciclo può anche essere eseguito su elenchi C ++, array C e sottoarray, nonché su sezioni di puntatori (sezioni, ad esempio ptr[2:8]per offset 2-7). Inoltre, c'è una conversione automatica tra diversi tipi di dati Python e tipi di dati C, sia per i tipi scalari (numeri) che per le stringhe di caratteri e i tipi di dati strutturati (ad es.Tipi di strutture C e dizionari Python).

prestazione

Molte delle ottimizzazioni eseguite dal compilatore Cython determinano automaticamente una specializzazione del codice C generato. A tale scopo, il compilatore utilizza dichiarazioni di tipo statico esplicite e inferenza di tipo (semplice) per generare codice C specializzato per i tipi di dati utilizzati e determinati modelli di codice. Gran parte delle ottimizzazioni nel compilatore Cython riguardano i loop, poiché gran parte del tempo di esecuzione totale di solito si accumula qui.

Le strutture di controllo (soprattutto i loop) vengono tradotte molte volte più velocemente con Cython e un compilatore C rispetto a quando vengono interpretate da CPython. Ciò è dovuto alle ottimizzazioni ottimistiche e all'inferenza del tipo. Ciò significa che il codice Python compilato da Cython di solito viene eseguito più velocemente che in CPython 2.6.x anche senza dichiarazioni di tipo esplicite, sebbene le prestazioni relative dipendono naturalmente dal codice in questione. Tuttavia, a causa della dichiarazione statica dei tipi di dati e della conseguente specializzazione del codice C, di solito è possibile ottenere un'accelerazione molte volte. Soprattutto con i calcoli matematici, i miglioramenti del runtime spesso risultano da un fattore da cento a mille. In confronto, l'accelerazione tipica attraverso il compilatore Python JIT Psyco è da quattro a cento volte circa , con PyPy in casi selezionati fino a dodici volte.

Il codice generato da Cython per le funzioni è ottimizzato per il disimballaggio e la conversione rapidi dei parametri di chiamata. Pertanto, la chiamata del codice nativo a Python tramite un wrapper Cython è generalmente più veloce rispetto ad altre implementazioni wrapper per Python.

aree di applicazione

Le aree di applicazione più importanti di Cython sono la connessione di librerie esterne all'interprete CPython, così come l'accelerazione del codice Python, specialmente nei calcoli matematici e negli algoritmi computazionalmente intensivi .

Ad esempio, il sistema di algebra del computer SageMath è in gran parte basato sul codice Cython. Viene utilizzato per implementare algoritmi matematici e per collegare codici esterni in C, C ++ e Fortran. Cython supporta anche un'interazione molto efficiente con NumPy - matrici , che sulla base di questi calcoli sono state notevolmente semplificate.

La libreria XML ad alte prestazioni lxml è ampiamente implementata in Cython. Le librerie C esterne libxml2 e libxslt sono collegate all'interprete Python.

Un altro esempio dall'ambiente di sviluppo Cython Core è la libreria MPI mpi4py. Collega varie implementazioni MPI a CPython.

Nell'indice dei pacchetti Python c'è un breve elenco di altre librerie implementate in Cython.

Progetti correlati e simili

  • Pyrex - predecessore di Cython
  • Unladen Swallow - ambiente di runtime CPython ottimizzato; basato su LLVM
  • PyPy - Framework del compilatore JIT e runtime Python che è esso stesso scritto in un dialetto Python (RPython)
  • Psyco - compilatore JIT specializzato e ottimizzatore di codice per l' ambiente di runtime CPython
  • Shed Skin: linguaggio di programmazione simile a Python di tipo statico compilato secondo C ++

Prove individuali

  1. Versione 0.29.21 . 8 luglio 2020 (accesso 9 luglio 2020).
  2. github.com . (accesso 2 febbraio 2020).
  3. ^ Cython: estensioni C per Python . (accesso 8 luglio 2018).
  4. versioni originali del predecessore Pyrex
  5. La compatibilità con Python 2 è l'obiettivo dichiarato per il futuro Cython versione 1.0 ( Memento del l' originale dal 10 agosto 2011 nella Internet Archive ) Info: Il dell'archivio collegamento è stato inserito automaticamente e non ancora verificata. Controllare l'originale e il collegamento all'archivio secondo le istruzioni, quindi rimuovere questo avviso. @ 1@ 2Modello: Webachiv / IABot / wiki.cython.org
  6. slice su docs.python.org, accesso 2 agosto 2018
  7. gmane.comp.python.cython.devel - confronto pybench di Cython e CPython 2.6.2
  8. gmane.comp.python.cython.devel - Passare un puntatore da Python ( Memento del l' originale dal 14 Febbraio 2017 in Internet Archive ) Info: Il dell'archivio collegamento è stato inserito automaticamente e non ancora verificata. Controllare l'originale e il collegamento all'archivio secondo le istruzioni, quindi rimuovere questo avviso. @ 1@ 2Modello: Webachiv / IABot / thread.gmane.org
  9. ^ Psyco - Introduzione
  10. Velocità di PyPy 1.4 rispetto a CPython 2.6.2 con / senza Psyco
  11. C ++ wrapper di parametri di riferimento per i vari Python wrapper di generatori (senza Cython) ( Memento del l' originale dal 4 aprile, 2015 in Internet Archive ) Info: Il dell'archivio collegamento è stato inserito automaticamente e non ancora verificata. Controllare l'originale e il collegamento all'archivio secondo le istruzioni, quindi rimuovere questo avviso. @ 1@ 2Modello: Webachiv / IABot / telecom.inescporto.pt
  12. Benchmark wrapper C ++ per Cython, Boost.Python e PyBindGen
  13. Elenco dei pacchetti Python implementati in Cython su PyPI