python - cython 类(class)很慢?

标签 python performance class 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 版本(只有函数和对它的调用)运行时间约为 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 秒

python :77s

最佳答案

为局部变量 n 声明一个类型:

cdef long n = self.n

关于python - cython 类(class)很慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10394660/

相关文章:

Python从类列表中选择项目

python - 管理站点过滤器,FilterSpec、RelatedFilterSpec、ChoicesFilterSpec 是如何工作的?

java - 为什么 Kotlin 类默认是 final 而不是 open?

python - Scrapy 中的嵌套选择器

php - MySQL表索引

javascript - Fabric.js 中的灰度很慢

python - 在类 __init__() 中获取实例名称

java - 将 System.out.format 翻译成 Clojure

java - 如何从 Java 中的另一个类获取变量?

python - 如何给 matplotlib slider 贴上标签?