Я пытаюсь всевозможные способы написать факториальную функцию в 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
Это может показаться глупым вопросом, но вы скомпилировали декорированную версию? – kwatford
Создание файла .py с декораторами cython не превращает файл python в файл cython, он просто позволяет использовать тот же файл без компиляции. Кроме того, в ipython-ноутбуке существует магия c% c%, которая автоматизирует процесс компиляции. – DaveP
@DaveP Получаю, что я должен скомпилировать чистый код python с помощью декоратора Cython. Я создал новую ячейку %% cython и написал в ней 'import cydecofact' и' deco_fact2 = cydecofact.deco_fact'. Затем я тестировал deco_fact2, но он все еще такой же медленный. – foresightyj