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
这可能看起来像一个愚蠢的问题,但你编译的装饰版本? – kwatford
使用cython装饰器创建一个.py文件不会自动将一个python文件转换为一个cython文件,它只允许在不编译的情况下运行相同的文件。另外,在ipython笔记本中,有一个%% cython magic可以自动编译过程。 – DaveP
@DaveP我知道我必须用Cython装饰器编译纯Python代码。我创建了一个新的%% cython单元,并在其中写入了'import cydecofact'和'deco_fact2 = cydecofact.deco_fact'。然后我测试了deco_fact2,但它仍然很慢。 – foresightyj