Windows下Cython使用(VS2017)


收到公眾號推送文章“利用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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM