6

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 バージョン (関数とその呼び出しのみ) は ~ 77 秒で実行され、クラス構造のない cython コードは ~ 10.2 秒で実行されます。

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

サイトン:10.2秒

パイソン:77秒

4

1 に答える 1

9

ローカル変数nの型を宣言します。

cdef long n = self.n
于 2012-05-01T07:39:56.653 に答える