2013-12-10 92 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的遞歸。

相關問題