收到公众号推送文章“利用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)的更多相关文章

  1. 【转】linux和windows下安装python集成开发环境及其python包

    本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...

  2. Windows下切分文件(GnuWin32)

    windows下碰到查看大日志文件还真麻烦,今天找了个工具来做这个:安装GnuWin32,然后用里面的split命令分割日志文件 ps:发现intellij idea还挺好,超过2g的日志文件也能进行 ...

  3. windows下编译php7图形库php_ui.dll

    CSDN博客 具有图形化编程才有意思,这几天看到了php ui 图形扩展,只是现在只能下载php 7.1的 本次教程编译php7.2.6的 php ui 要是linux下编译起来比较简单 但是 win ...

  4. windows下使用redis c++

    redis是高效key-value NOSQL 数据库 代码开源 windows下使用需要使用微软在redis官方上的改进版 地址 https://redis.io/download 寻找window ...

  5. QT学习之windows下安装配置PyQt5

    windows下安装配置PyQt5 目录 为什么要学习QT 命令行安装PyQt5以及PyQt5-tools 配置QtDesigner.PyUIC及PyRcc 为什么要学习QT python下与界面开发 ...

  6. Windows下安装Tensorflow报错 “DLL load failed:找不到指定的模块"

    Windows下安装完tensorflow后,在cmd下运行python后import tensorflow出现如下错误: Traceback (most recent call last):  Fi ...

  7. windows 下开发的 .netCore MVC 部署到 Linux(Mint)

    这两天在公司跟同事偶然聊到 .netCore,说到一些趋势什么的.但是说来说去自己也没试过在Linux 机子上部署过,所以就试一下. 尝试之前也在网上看了一些文章,包括 Linux 上.netCore ...

  8. linux和windows下安装python拓展包及requirement.txt安装类库

    python拓展包安装 直接安装拓展包默认路径: Unix(Linux)默认路径:/usr/local/lib/pythonX.Y/site-packagesWindows默认路径:C:\Python ...

  9. Windows下编译最新版ChezScheme

    据说ChezScheme是最快的神级编译器,一秒钟几百万行,王垠说的2秒内编译自身绝不是夸张(看这里<揭秘Chez Scheme>,Scheme中文社区).ChezScheme由美国印第安 ...

随机推荐

  1. vue自定义指令clickoutside实现点击其他元素才会触发

    clickoutside.js // 代码内容 const clickoutsideContext = '@@clickoutsideContext'; export default { bind(e ...

  2. 关于char(M)和varchar(N)的区别

    1.int(10)的10表示显示的数据的长度,不是存储数据的大小:chart(10)和varchar(10)的10表示存储数据的大小,即表示存储多少个字符. int(10) 10位的数据长度 9999 ...

  3. FrameWork内核解析之布局加载与资源系统(三)

    阿里P7Android高级架构进阶视频免费学习请点击:https://space.bilibili.com/474380680本篇文章将继续从以下两个内容来介绍布局加载与资源系统: [ LayoutM ...

  4. iView的page 组件

    //html <div class="pageNation"> <Page :total= totalPages :page-size= pageSize siz ...

  5. 灯泡编程题-java

    现在有100个灯泡,每个灯泡都是关着的,灯泡排序为1~100,接着将2的倍数的灯泡开关按一下,然后将3的倍数的灯泡开关按一下……直到将N的倍数的灯泡开关按一下,最后统计灯泡亮着的数目. 算法思路: 1 ...

  6. texindex - 对 Texinfo 索引文件排序

    SYNOPSIS 总览 texindex [OPTION]... FILE... DESCRIPTION 描述 为每个 Tex 输出文件 FILE 产生一个已排序的索引.通常对于文档 `foo.tex ...

  7. [转载]图文详解YUV420数据格式

    原博主的博客为:https://www.cnblogs.com/azraelly/archive/2013/01/01/2841269.html YUV格式有两大类:planar和packed.对于p ...

  8. 笔记62 Spring Boot快速入门(二)

    SpringBoot部署 一.jar方式 1.首先安装maven. <1>下载最新的maven版本:https://maven.apache.org/download.cgi <2& ...

  9. NDK笔记(二)-在Android Studio中使用ndk-build(转)

    前面一篇我们接触了CMake,这一篇写写关于ndk-build的使用过程.刚刚用到,想到哪儿写哪儿. 环境背景 Android开发IDE版本:AndroidStudio 2.2以上版本(目前已经升级到 ...

  10. mysql rpm包安装

    MySql5.7 安装文档 1.yum repo 安装 ``` wget http://dev.mysql.com/get/mysql57-community-release-el6-11.noarc ...