2012-05-01 15 views
5

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

+0

La C generata sembra ...? –

risposta

8

dichiarare un tipo di variabile locale n:

cdef long n = self.n 
+0

Grazie funziona. Ho dimenticato di dichiarare un tipo per la variabile locale n. :) – user5198

+0

La velocità è ora alla pari con la versione senza classe – user5198