2012-05-01 3 views
5

Этот код, который содержит Cython классы:очень медленные классы cython?

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" 

которую я назвал, как это после компиляции для расширения Python:

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

и печатает 207.374788046 (в секундах)

но чистый Версия python (только с функцией и вызовом) работает в ~ 77s , а код cython без структуры классов работает в ~ 10,2s

класса менее версия в 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 версии:

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

    return fac 

print factors(10000007) 

Я хочу использовать классы Cython для моей библиотеки, но, кажется, что они очень медленно по сравнению с функциональным программированием стиля в Cython , Очевидно, что что-то не так в моем коде класса cython. Как я могу улучшить свою скорость?

Суммируя результаты тестов:

Cython класс: 206S

Cython: 10.2s

Python: 77s

+0

Сгенерированный C выглядит как ...? –

ответ

8

объявить тип для локальной переменной п:

cdef long n = self.n 
+0

Спасибо, что работает. Я забыл объявить тип для локальной переменной n. :) – user5198

+0

Скорость теперь наравне с версией без классов – user5198

Смежные вопросы