Cython / Python сравнение недопустимая синтаксическая ошибка - PullRequest
0 голосов
/ 29 мая 2020

Я хотел бы сравнить 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? что мне не хватает?

1 Ответ

0 голосов
/ 29 мая 2020

Проблема не в вашем определении fastfactorial, а в том, что ваш setup.py завершился с ошибкой и, предположительно, без компиляции fastfa c в библиотеку c. В общем, вы всегда должны исправлять такие ошибки.

Кажется, ваша ошибка возникает из-за того, что у вас не установлен компилятор Microsoft Visual C ++. Вы можете следовать инструкциям в этом ответе, чтобы выбрать версию Visual C ++ для установки.

У вас также есть предупреждение о том, что language_level не установлен. Вы также не должны игнорировать предупреждения, поэтому стоит явно указать уровень в вашем setup.py.

setup(ext_modules=cythonize('fastfac.pyx'), language_level=3)
...