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
Windows下Cython使用(VS2017)的更多相关文章
- 【转】linux和windows下安装python集成开发环境及其python包
本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...
- Windows下切分文件(GnuWin32)
windows下碰到查看大日志文件还真麻烦,今天找了个工具来做这个:安装GnuWin32,然后用里面的split命令分割日志文件 ps:发现intellij idea还挺好,超过2g的日志文件也能进行 ...
- windows下编译php7图形库php_ui.dll
CSDN博客 具有图形化编程才有意思,这几天看到了php ui 图形扩展,只是现在只能下载php 7.1的 本次教程编译php7.2.6的 php ui 要是linux下编译起来比较简单 但是 win ...
- windows下使用redis c++
redis是高效key-value NOSQL 数据库 代码开源 windows下使用需要使用微软在redis官方上的改进版 地址 https://redis.io/download 寻找window ...
- QT学习之windows下安装配置PyQt5
windows下安装配置PyQt5 目录 为什么要学习QT 命令行安装PyQt5以及PyQt5-tools 配置QtDesigner.PyUIC及PyRcc 为什么要学习QT python下与界面开发 ...
- Windows下安装Tensorflow报错 “DLL load failed:找不到指定的模块"
Windows下安装完tensorflow后,在cmd下运行python后import tensorflow出现如下错误: Traceback (most recent call last): Fi ...
- windows 下开发的 .netCore MVC 部署到 Linux(Mint)
这两天在公司跟同事偶然聊到 .netCore,说到一些趋势什么的.但是说来说去自己也没试过在Linux 机子上部署过,所以就试一下. 尝试之前也在网上看了一些文章,包括 Linux 上.netCore ...
- linux和windows下安装python拓展包及requirement.txt安装类库
python拓展包安装 直接安装拓展包默认路径: Unix(Linux)默认路径:/usr/local/lib/pythonX.Y/site-packagesWindows默认路径:C:\Python ...
- Windows下编译最新版ChezScheme
据说ChezScheme是最快的神级编译器,一秒钟几百万行,王垠说的2秒内编译自身绝不是夸张(看这里<揭秘Chez Scheme>,Scheme中文社区).ChezScheme由美国印第安 ...
随机推荐
- Django 自定义模型管理器(Manager)及方法
转载自:https://www.cnblogs.com/sui776265233/p/11571418.html 1.自定义管理器(Manager) 在语句Book.objects.all()中,ob ...
- jenkins中的pipeline学习
Jenkins pipeline 升级打怪攻略(二): http://haurqb42j0gnc7zyxam.exp.bcevod.com/mda-jg9eq66184z5manh/mda-jg9eq ...
- 一步一步学Vue(六)https://www.cnblogs.com/Johnzhang/p/7242640.html
一步一步学Vue(六):https://www.cnblogs.com/Johnzhang/p/7237065.html 路由 一步一步学Vue(七):https://www.cnblogs.com ...
- 【题解】Ride to Office
题目描述 起点与终点相隔4500米.现Charley 需要从起点骑车到终点.但是,他有个习惯,沿途需要有人陪伴,即以相同的速度, 与另外一个人一起骑.而当他遇到以更快的速度骑车的人时,他会以相应的速度 ...
- Groovy学习:第四章 Groovy特性深入
作者:chszs 1. 断言 Java开发者常常使用JUnit或TestNG做单元测试,所以对断言是很清楚的.断言是用于验证假设的条件是否为真.在Groovy的断言中,如果假设的条件不为真,那么就会抛 ...
- hbase报错: hbase.PleaseHoldException: Master is initializing
查看hbase服务状态报错: hbase(main)::> status ERROR: org.apache.hadoop.hbase.PleaseHoldException: Master ...
- 两台群晖之间传输数据NFS
如何在两台局域网的群晖之间传输数据,可以用NFS的方式来实现.摘抄如下,地址http://www.nasyun.com/thread-64638-1-1.html?reload=true 假设要把群晖 ...
- vue 项目 跳转 页面 不刷新 问题
vue项目中需要导出下载客户数据,因为数据太多,响应太慢.后台直接上传给七牛 然后返回一个下载链接 前端通过跳转链接 来下载 riskManagementApi.friendExprotAll(t ...
- ArrayList,LinkedList,Vector集合的认识
最近在温习Java集合部分,花了三天时间读完了ArrayList与LinkedList以及Vector部分的源码.之前都是停留在简单使用ArrayList的API,读完源码看完不少文章后总算是对原理方 ...
- Work 4(通知类) (2019.04.25)