2012-05-01 32 views
5

Ten kod, który zawiera Cython klasy:bardzo wolne klasy cytonowe?

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" 

który nazwałem tak po kompilacji do rozszerzenia Pythona:

from time import time 
t1 = time() 
import factors_class 
ben = factors_class.Bench(1000000007) 
print ben.factors() 
t2 = time() 
print t2 - t1 

i wypisuje 207.374788046 (w sekundach)

ale czysty wersja python (z samą funkcją i wywołaniem) działa w ~ 77s , a kod cythonowy bez struktury klas działa w ~ 10,2 s.

klasy mniejsza wersja 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 version:

def factors(n): 
    fac = 0 
    for i in xrange(2, n): 
     if n % i == 0: 
      fac += 1 

    return fac 

print factors(10000007) 

Chcę użyć klasy Cython do mojej biblioteki, ale wydają się być bardzo powolny w porównaniu do programowania funkcjonalnego stylu w Cython . Najwyraźniej coś jest nie tak w moim kodzie cytonowym. Jak mogę poprawić jego prędkość?

Podsumowując wyniki testów:

klasy Cython: 206s

Cython: 10.2s

pyton: 77s

+0

Wygenerowany C wygląda jak ...? –

Odpowiedz

8

zadeklarować rodzaju dla zmiennej lokalnej n:

cdef long n = self.n 
+0

Dzięki temu działa. Zapomniałem zadeklarować typ dla zmiennej lokalnej n. :) – user5198

+0

Prędkość jest teraz na równi z wersją bez klas – user5198

Powiązane problemy