Questo codice che contiene le classi Cython:classi cython molto lente?
cdef class Bench:
cdef long n
def __cinit__(self, long n):
self.n = n
cpdef int factors(self):
n = self.n
cdef int fac = 0
cdef unsigned long i
for i in range(2, n):
if n % i == 0:
fac += 1
return fac
if __name__ == "__main__":
print "hw"
che ho chiamato in questo modo dopo la compilazione di un estensione python:
from time import time
t1 = time()
import factors_class
ben = factors_class.Bench(1000000007)
print ben.factors()
t2 = time()
print t2 - t1
ed esso stampa 207.374788046 (secondi)
ma la pura la versione python (con solo la funzione e una chiamata ad esso) viene eseguita in ~ 77s e un codice cython senza struttura di classe viene eseguito in ~ 10.2s
versione della classe-meno in Cython:
cdef int factors(unsigned long n):
cdef int fac = 0
cdef unsigned long i
for i in range(2, n):
if n % i == 0:
fac += 1
return fac
print factors(1000000007)
if __name__ == "__main__":
print "hw"
Python versione:
def factors(n):
fac = 0
for i in xrange(2, n):
if n % i == 0:
fac += 1
return fac
print factors(10000007)
voglio utilizzare le classi Cython per la mia libreria, ma, sembrano essere molto lento rispetto alla programmazione stile funzionale in Cython . Chiaramente c'è qualcosa di sbagliato nel mio codice di classe cython. Come posso migliorare la sua velocità?
Per riassumere i risultati dei benchmark:
classe Cython: 206S
Cython: 10.2s
pitone: 77s
La C generata sembra ...? –