2012-05-01 36 views
5

Mã này chứa các lớp cython:các lớp cython rất chậm?

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" 

mà tôi gọi là như thế này sau khi biên dịch để một phần mở rộng python:

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

và nó in ra 207,374788046 (Giây)

nhưng tinh khiết Phiên bản python (chỉ với chức năng và cuộc gọi đến nó) chạy trong ~ 77s và mã cython không có cấu trúc lớp chạy trong ~ 10.2s

đẳng cấp ít phiên bản trong 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 phiên bản:

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

    return fac 

print factors(10000007) 

Tôi muốn sử dụng lớp cython cho thư viện của tôi, nhưng họ dường như rất chậm so với các chương trình phong cách chức năng trong cython . Rõ ràng một cái gì đó là sai trong mã lớp cython của tôi. Làm cách nào để cải thiện tốc độ của nó?

Để tóm tắt các kết quả benchmark:

Cython lớp: 206s

Cython: 10.2s

python: 77s

+0

Tạo C trông giống như ...? –

Trả lời

8

khai báo một kiểu cho biến n địa phương:

cdef long n = self.n 
+0

Cảm ơn công trình này. Tôi quên khai báo một kiểu cho biến cục bộ n. :) – user5198

+0

Tốc độ bây giờ là ngang bằng với phiên bản lớp ít – user5198