2012-12-21 8 views
5

Voglio creare un'estensione Python e mi piace molto l'idea di usare Cython. Principalmente per acquisire maggiore conoscenza su di esso e per sfruttare i guadagni di velocità, se del caso. Ho letto un bel po 'di documentazione Cython ma non sono ancora uno scienziato informatico e non ho una conoscenza approfondita per capire le basi di basso livello, da qui la ragione delle mie seguenti domande:Cosa fa Cython con le importazioni?

mi chiedo semplicemente, cosa succede se utilizzo un file importato esternamente (ad esempio, una libreria ORM o SQL o qualsiasi altra libreria di terze parti) nell'estensione Python che sto sviluppando?

Come gestisce Cython?

C'è una differenza se questa libreria/estensione importata è in puro Python o se è anche compilata?

Qual è il modo corretto per gestire questo?

Grazie.

PS. Le domande sono scritte in grassetto.

risposta

5

L'obiettivo di cython è di essere compatibile con Python, cioè che puoi cythonizzare qualsiasi codice Python e funzionerà come prima. Attualmente, una grande parte del codice Python funziona già. Cython consente inoltre di ottimizzare parti del codice e di compilarlo in un codice C più efficiente.

Detto questo, qualsiasi importazione di python rimarrà invariata. Tutte le chiamate a loro saranno emesse come comandi python. Anche se il modulo è scritto in C, cython prenderà la deviazione tramite python per chiamare le funzioni del modulo. Se si desidera utilizzare direttamente una libreria C, è necessario disporre di associazioni cython per loro. cython documentation explains how to do this.

In genere Python funge da sorvegliante e gestisce gli ambiti di moduli/classi. Se il codice in un modulo chiama qualsiasi funzione python (o accede a una variabile python), python risolverà la chiamata in base all'ambito del chiamante. Se la funzione chiamata si trova in un secondo modulo, python lo sta usando tranquillamente. Il chiamante otterrà solo il risultato e non dovrebbe preoccuparsi se l'altra funzione fosse in un modulo diverso o meno. La chiave è quindi le regole di scoping di python che decidono quale funzione viene chiamata.