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