2013-12-10 47 views
2

我想用各种方法在Cython中编写阶乘函数。首先,我尝试iPython Notebook中的pyx文件版本。为什么Cython装饰器版本比Cython 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 
+4

这可能看起来像一个愚蠢的问题,但你编译的装饰版本? – kwatford

+1

使用cython装饰器创建一个.py文件不会自动将一个python文件转换为一个cython文件,它只允许在不编译的情况下运行相同的文件。另外,在ipython笔记本中,有一个%% cython magic可以自动编译过程。 – DaveP

+0

@DaveP我知道我必须用Cython装饰器编译纯Python代码。我创建了一个新的%% cython单元,并在其中写入了'import cydecofact'和'deco_fact2 = cydecofact.deco_fact'。然后我测试了deco_fact2,但它仍然很慢。 – foresightyj

回答

0

您需要@cython.compile来实际编译代码。但是,它看起来不是cython.cfunc,也不支持@cython.compile的递归。

相关问题