[英]Cython/Python comparison invalid syntax error
我想在時間執行方面將 Python 與 Cython 進行比較,所以我寫了兩個文件:
文件
def factorial(n):
if n >= 1:
return n*factorial(n - 1)
return 1
fastfac.pyx
cpdef long fastfactorial(long n):
if n>= 1:
return n*fastfactorial(n - 1)
return 1
然后我寫了一個安裝文件:
安裝程序.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
但是我試圖進行比較,所以我寫了文件:
比較.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'
似乎在文件python.pyx
中,定義cpdef long fastfactorial(long n)
未被識別為常規 function 定義,而是作為語法錯誤; 事實上,如果我嘗試運行該文件,我會收到錯誤消息:
File "C:/Users/...../fastfac.pyx", line 1
cpdef long fastfactorial(long n):
^
SyntaxError: invalid syntax
我該如何解決? 如何在 a.pyx 文件中正確定義cpdef
? 我錯過了什么?
問題不在於您對 fastfactorial 的定義,而是您的 setup.py 退出並出現錯誤,並且可能沒有將 fastfac 編譯到 c 庫中。 通常,您應該始終修復此類錯誤。
您的錯誤似乎正在發生,因為您沒有安裝 Microsoft Visual C++ 編譯器。 您可以按照此答案中的說明選擇要安裝的 Visual C++ 版本。
您還會收到有關未設置 language_level 的警告。 您也不應該忽略警告,因此值得在 setup.py 中明確說明級別。
setup(ext_modules=cythonize('fastfac.pyx'), language_level=3)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.