为什么Cython Decorator版本比Cython Pyx版本慢?

时间:2013-12-10 02:15:58

标签: python cython

我正在尝试各种方法在Cython中编写阶乘函数。首先,我在iPython Notebook中尝试了pyx文件版本。

%%file pyxfact.pyx
cdef long pyxfact(long n):
    if n <=0:
        return 1
    else:
        return n * pyxfact(n-1)

def fact(long n):
    return pyxfact(n)

然后我尝试了同样的,至少我是这么认为的,在Cython装饰器中,像这样:

%%file cydecofact.py
import cython

@cython.cfunc # equivalent to cdef, while @cython.ccall is equivalent to cpdef
@cython.returns(cython.long)
@cython.locals(n=cython.long)
def deco_fact(n):
    if n <=0:
        return 1
    else:
        return n * deco_fact(n-1)

@cython.locals(n=cython.long)
def fact(n):
    return deco_fact(n)

令我惊讶的是,这两个版本的运行时差很大:

%timeit -n 10000 pyxfact.fact(10)
%timeit -n 10000 cydecofact.fact(10)

10000 loops, best of 3: 219 ns per loop
10000 loops, best of 3: 2 µs per loop

1 个答案:

答案 0 :(得分:0)

您需要@cython.compile来实际编译代码。但是,cython.cfunc似乎既不支持@cython.compile也不支持递归。