2013-12-10 5 views
2

Я пытаюсь всевозможные способы написать факториальную функцию в Cython. Сначала я попробовал версию файла pyx в iPython Notebook.Почему версия Cython Decorator медленнее, чем версия 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

Создание файла .py с декораторами cython не превращает файл python в файл cython, он просто позволяет использовать тот же файл без компиляции. Кроме того, в ipython-ноутбуке существует магия c% c%, которая автоматизирует процесс компиляции. – DaveP

+0

@DaveP Получаю, что я должен скомпилировать чистый код python с помощью декоратора Cython. Я создал новую ячейку %% cython и написал в ней 'import cydecofact' и' deco_fact2 = cydecofact.deco_fact'. Затем я тестировал deco_fact2, но он все еще такой же медленный. – foresightyj

ответ

0

Для того, чтобы действительно составить код, вам нужен @cython.compile. Однако, похоже, ни cython.cfunc, ни рекурсия не поддерживаются для @cython.compile.

Смежные вопросы