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