收到公眾號推送文章“利用Cython為Python代碼加速”后嘗試在Windows平台下使用Cython,環境為Python3.5 + VS2017。
1. 簡單嘗試
1)新建hello.pyx文件,內容如下:
print("Hello World.")
2)新建setup.py腳本,其作用:使用cython編譯器去編譯pyx文件
from distutils.core import setup from Cython.Build import cythonize setup( ext_modules=cythonize("hello.pyx") )
3)在終端上運行命令
python setup.py build --inplace # inplace表示源代碼在同一目錄下
若編譯成功,則在目錄下會出現兩個文件:hello.c,xxx.pyd(若在Linux平台下會出現hello.so),此時.so文件或者.pyd文件就可以像普通的python文件一樣,被import。
2. 加速測試(以斐波那契數列為例)
1)fibonacci_c.pyx
# Cython版本
def fibonacci_c(int n): if n < 0: print("1st fibonacci number = 0") elif n == 1: return 0 elif n == 2: return 1 else: return fibonacci_c(n-1) + fibonacci_c(n-2)
2)cython_test.py
#!/usr/bin/env python # coding: utf-8 import datetime import pyximport pyximport.install() import fibonacci_c # 使用此方式直接import,無需顯示編譯,由cython自動完成編譯
# Python版本 def fibonacci(n): if n < 0: print("1st fibonacci number = 0") elif n == 1: return 0 elif n == 2: return 1 else: return fibonacci(n-1) + fibonacci(n-2) start = datetime.datetime.now() print(fibonacci_c.fibonacci_c(39)) end = datetime.datetime.now() print("fibonacci_c escaped: " + str((end-start).seconds) + "s") start = datetime.datetime.now() print(fibonacci(39)) end = datetime.datetime.now() print("fibonacci escaped: " + str((end-start).seconds) + "s")
3)運行cython_test.py,得到
39088169 fibonacci_c escaped: 5s 39088169 fibonacci escaped: 31s
可見,使用Cython將獲得6倍的加速。
PS:Cython能比常規Python代碼快多少實際上取決於代碼本身。例如,如果運行成本較高的多變量循環,Cython明顯優於常規的Python代碼。遞歸函數同樣使得Cython快於Python。
問題解決:
1)cython找不到vcvarsall.bat(error: Unable to find vcvarsall.bat)
修改Python安裝路徑下用於尋找C++編譯器的文件_msvccompiler.py(i.e. C:\Program Files\Python35\Lib\distutils\_msvccompiler.py),其通過尋找注冊表來找到文件vcvarsall.bat的路徑,但注冊表中的路徑有誤,需要修改。(本環境為VS2017,其它版本類似)
需要修改以下兩行:
# r"Software\Microsoft\VisualStudio\SxS\VC7", r"Software\WOW6432Node\Microsoft\VisualStudio\SxS\VS7", # vcvarsall = os.path.join(best_dir, "vcvarsall.bat") vcvarsall = os.path.join(best_dir, "VC\\Auxiliary\\Build\\vcvarsall.bat")
Ref:
cython找不到vcvarsall.bat (安裝有VS2017+)-百度經驗
https://jingyan.baidu.com/article/92255446622fde851648f405.html
Cython入門到放棄(一) - lyx的專欄 - CSDN博客
https://blog.csdn.net/qtlyx/article/details/80614608