Я хотел бы сравнить Python с Cython по времени выполнения, поэтому я написал два файла:
fa c .py
def factorial(n):
if n >= 1:
return n*factorial(n - 1)
return 1
fastfa c .pyx
cpdef long fastfactorial(long n):
if n>= 1:
return n*fastfactorial(n - 1)
return 1
Затем я написал установочный файл:
setup.py
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize('fastfac.pyx'))
Из Powershell я выполнил две команды:
pip install Cython
python setup.py build_ext --inplace
Из второй команды я получил следующее сообщение:
Compiling fastfac.pyx because it changed.
[1/1] Cythonizing fastfac.pyx
C:\Users\.....\venv\lib\site-packages\Cython\Compiler\Main.py:369: FutureWarning: Cython directive 'language_level' not set, using 2 for now (Py2). This will change in a later release! File: C:\Users\.....\fastfac.pyx
tree = Parsing.p_module(s, pxd, full_module_name)
running build_ext
building 'fastfac' extension
error: Unable to find vcvarsall.bat
Однако я попытался провести сравнение, поэтому Я написал файл:
compare.py
from fastfac import fastfactorial
from fac import factorial
from timeit import timeit
print(timeit('fastfactorial(20)', globals = globals(), number = 10000))
print(timeit('factorial(20)', globals = globals(), number = 10000))
Когда я запускаю его, я получаю следующее сообщение об ошибке:
Traceback (most recent call last):
File "C:/Users/...../comparison.py", line 1, in <module>
from fastfac import fastfactorial
ModuleNotFoundError: No module named 'fastfac'
It кажется, что в файле python.pyx
определение cpdef long fastfactorial(long n)
распознается не как обычное определение функции, а как синтаксическая ошибка; Фактически, если я попытаюсь запустить этот файл, я получаю сообщение об ошибке:
File "C:/Users/...../fastfac.pyx", line 1
cpdef long fastfactorial(long n):
^
SyntaxError: invalid syntax
Как я могу решить? Как я могу правильно определить cpdef
внутри файла .pyx? что мне не хватает?