Windows下Cython使用(VS2017)

收到公衆號推送文章「利用Cython爲Python代碼加速」後嘗試在Windows平臺下使用Cython,環境爲Python3.5 + VS2017。html

1. 簡單嘗試python

1)新建hello.pyx文件,內容以下:app

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。ui

 

2. 加速測試(以斐波那契數列爲例)spa

1)fibonacci_c.pyx.net

# 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.pycode

#!/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,獲得htm

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

相關文章
相關標籤/搜索