Windows下Cython使用(VS2017)

Windows下Cython使用(VS2017)
强烈推介IDEA2021.1.3破解激活,IntelliJ IDEA 注册码,2021.1.3IDEA 激活码  

大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说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

 

转载于:https://www.cnblogs.com/wmxfd/p/using_cython_under_windows_platform.html

本文来源weixin_30595035,由架构君转载发布,观点不代表Java架构师必看的立场,转载请标明来源出处:https://javajgs.com/archives/29599

发表评论