Domanda

Ho appena imbattuto Cython, mentre ero alla ricerca di modi per ottimizzare il codice Python. Ho letto diversi messaggi su StackOverflow, il wiki pitone e letto l'articolo "Norme generali per l'ottimizzazione".

Cython è qualcosa che afferra il mio interesse più; invece di scrivere codice C per te stesso, è possibile scegliere di avere altri tipi di dati nel codice Python stesso.

Ecco un test stupido ho provato,

#!/usr/bin/python
# test.pyx
def test(value):
    for i in xrange(value):
    i**2
    if(i==1000000):
        print i

test(10000001)

$ tempo python test.pyx

real    0m16.774s 
user    0m16.745s
sys     0m0.024s

$ tempo Cython test.pyx

real    0m0.513s 
user    0m0.196s 
sys     0m0.052s

Ora, onestamente, i `m sbalordito. Il codice che ho usato qui è il codice python puro, e tutto quello che ho cambiato è l'interprete. In questo caso, se Cython questo è un bene, allora perché la gente ancora utilizzare il tradizionale interprete Python? Ci sono problemi di affidabilità per Cython?

È stato utile?

Soluzione

Le altre risposte hanno già spiegato come si erano appena compilazione del codice Cython, non eseguirlo. Tuttavia, ho pensato che si potrebbe desiderare di sapere quanto più veloce Cython può rendere il vostro codice. Quando ho compilato il codice che avete (anche se ho eseguito la funzione da da un modulo diverso) con distutils , ho ottenuto guadagni di velocità molto marginali oltre Python dritto - circa 1%. Tuttavia, quando ho aggiunto un paio di piccole modifiche al codice:

def test(long long value):
    cdef long long i
    cdef long long z
    for i in xrange(value):
        z = i**2
        if(i==1000000):
            print i
        if z < i:
            print "yes"

e compilato, ho ottenuto i seguenti orari:

  • codice puro Python: 20.4553578737 secondi
  • Codice Cython: 0.199339860234 secondi

Questo è un × speed-up 100. Non troppo malandato.

Altri suggerimenti

Cython non è un altro interprete. Esso genera c-estensioni per Python, in pitone (-come) del codice. cython test.pyx solo generare un file 'test.c', che (una volta compilato) può essere utilizzato da pitone proprio come una libreria Python normale.

Ciò significa che si stanno solo misurando il tempo necessario per Cython per tradurre il vostro codice Python in C, non come veloce che versione dei esegue il codice.

  • cython test.pyx in realtà non eseguire il programma. Il binario cython è per l'elaborazione del codice Cython in un modulo di estensione Python. Si dovrà importarlo in Python per eseguirlo.

  • #!/usr/bin/python non è la migliore linea di shebang per gli script Python. #!/usr/bin/env python è generalmente preferito, che corre qualsiasi python avrebbe sulla riga di comando.

    • file pyx Cython probabilmente non dovrebbe avere una linea shebang a tutti, tranne che nel caso d'angolo sono programmi Python validi.
  • Hai IndentationError nel codice distaccati.

  • Utilizzando l'interprete tradizionale è più semplice e più portabile. Cython è affidabile, ma ha i suoi limiti e peculiarità. Potrebbe essere interessante per usarlo tonnellate di più se magicamente dato i speedups il timing far sembrare lo fa, ma dà in realtà più piccole. Dovrete iniziare a utilizzare Cython-specifiche caratteristiche di utilizzare C dispone di vedere un sacco di aumento di velocità.

Un grande punto che sembra mancare: Cython non è un superset rigoroso di Python. Ci sono alcune caratteristiche che Python supporta, ma Cython non lo fa. Più in particolare, generatori e lambda (ma sono più prossimi).

  • Il più grande motivo Cython non è così popolare è che manca di stand-alone (senza python) eseguibili.

  • mancanza di pubblicità. Gli sviluppatori sembrano essere studiosi più interessati a sviluppare il loro software Sage, di una lingua tagliente.

  • Le insidie ??incontrato durante lo sviluppo. Uno che si incontra la mancanza di sostegno filo vera. Tutto è avvolto in una serratura interprete globale, il che rende threadsafe, ma disabilitando la concorrenza!

Per tutti coloro che desiderano che Cython effettivamente compilato e corse il programma in una sola riga, ho creato runcython ( http: // github.com/russell91/runcython ). runcython test.pyx avrà la semantica che l'OP inteso

Come molti di commenti che suggeriscono il tempo che avete menzionato con Cython è solo tempo impiegato nella conversione di file .py nel file .c. Quel file .c saranno grandi interms della memoria. Il vantaggio è che è possibile compilare il file .c usando il compilatore C anche

Vi darò un esempio: Se si dispone di un file python abbiamo bisogno di memorizzare in formato .pyx. Eseguendo " Cython xyz.pyx " si creerà .c e .so file

Consente di check-in picture file creati dal comando Cython

La dimensione anche un aumento nel mio caso ha cambiato per Byte a Kb

C'è qualche metodo specifico per compilare il codice python si può fare riferimento questo link:

http://cython.readthedocs.io/en/latest /src/reference/compilation.html https://rajeshrinet.github.io/blog/2014/cython/

Un'altra cosa che ho notato non è dove si menzionano i problemi di memoria in Cython Quando provo a implementare nei miei project.I incorporati sono di fronte a molti problemi di memoria.

Si può provare PyPy Dove non c'è bisogno di mettere sforzi supplementari per compilare ed il tempo ridotto anche in termini di tempo di compilazione

Fare riferimento l'immagine: confronto tempo tra Python e PyPy

Grazie ..

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top