Cython学习

1. Cython是什么?

它是一个用来快速生成Python扩展模块(extention module)的工具

语法是Python和c的混血

Cython作为一个Python的编译器,在科学计算方面很流行,用于提高Python的速度,通过OpenMPI库还可以进行吧并行计算。

2. Cython安装(Windows)

我的环境是win7 x64, python27, vs2010

安装的基础是有一个c编译器(这里以vs2010为例)

从http://cython.org下载安装包,解压到一目录,进入该目录,在cmd命令行中执行

python setup.py install

:执行过程可能遇到问题:Windows下pip安装包报错:Microsoft Visual C++ 9.0 is required Unable to find vcvarsall.bat

解决方案:下载Microsoft Visual C++ Compiler for Python 2.7,点击直接安装即可。

3. 例子

例3.1:入门

创建hello.pyx,内容如下

def say_hello():
    print "Hello World!"

创建setup.py,内容如下

from distutils.core import setup
from Cython.Build import cythonize
setup(name = ‘Hello world app‘,
      ext_modules = cythonize("hello.pyx"))

编译Cython代码

  • step1: 把.pyx文件被Cython便以为.c文件
  • step2: 把.c文件编译为可导入的使用模块.so(Windows下为.pyd)文件
python setup.py build
python setup.py install

:可能出现问题:Unable to find vcvarsall.bat

原因:Python 2.7 会搜索 Visual Studio 2008.如果你电脑上没有这个版本的话就会报错。

如果装的是vs2010,那么在cmd命令行中执行

SET VS90COMNTOOLS=%VS100COMNTOOLS%

如果装的是vs2010,那么在cmd命令行中执行 

SET VS90COMNTOOLS=%VS110COMNTOOLS%

执行

>>> import hello
>>> hello.say_hello()
Hello World!

  

例3.2 通过静态类型提高速度

在Cython中可以通过标记静态类型来提高速度,凡是标记为静态类型的部分都会将动态语言类型变为简单的c代码,从而提速。

但是如果滥用静态类型,会降低可读性,甚至因类型设置不当导致错误类型检查造成速度降低。

例3.2.1 静态类型变量

Python原生态代码

compute.pyx

def f(x):
    return x ** 2 - x
def integrate_f(a, b, N):
    s = 0
    dx = (b - a) / N
    for i in range(N):
        x += f(a + i * dx)
    return s * dx

setup.py

from distutils.core import setup
from Cython.Build import cythonize
setup(
  name = ‘Hello world app‘,
  ext_modules = cythonize("compute.pyx"),)

test.py

import compute
import time
starttime = time.clock()
compute.integrate_f(3.2, 6.9, 1000000)
endtime = time.clock()
print "read: %f s" %(endtime - starttime)

执行

python setup.py build
python setup.py install
python test.py

结果

read: 0.332332 s

使用静态变量替换后的代码

compute2.pyx

def f(double x):
    return x ** 2 - x
def integrate_f(double a, double b, int N):
    cdef int i
    cdef double s, dx
    s = 0
    dx = (b - a) / N
    for i in range(N):
        s += f(a + i * dx)
    return s * d

setup2.py

from distutils.core import setup
from Cython.Build import cythonize
setup(
  name = ‘Hello world app‘,
  ext_modules = cythonize("compute2.pyx"),
)

test2.py

import compute2
import time
starttime = time.clock()
compute2.integrate_f(3.2, 6.9, 1000000)
endtime = time.clock()
print "read: %f s" %(endtime - starttime)

执行

python setup.py build
python setup.py install
python test.py

结果

read: 0.109200s

结论

该测试用例,使用静态类型速度是不使用静态类型的3倍。

例3.2.2 静态类型函数

把compute2.pyx中的函数变为

cdef double f(double x):
    return x ** 2 - x
def integrate_f(double a, double b, int N):
    cdef int i
    cdef double s, dx
    s = 0
    dx = (b - a) / N
    for i in range(N):
        s += f(a + i * dx)
    return s * dx

结果

read: 0.084859 s

结论:比例子3.2.1速度又快了

例3.3 调用C函数

cdef extern from "math.h":
    double sin(double)
    double cos(double)

cpdef double Sin(double x):
    return sin(x)

cpdef double Cos(double x):
    return cos(x)
  • cpdef: 对于Python可使用的函数使用(为了使得在以后的Python程序中调用Sin,Cos函数,用cpdef,而不用cdef)
  • cdef: 对于C可使用的函数使用

请注意,上面的代码声明了 math.h 里的函数,提供给 Cython 使用。C编译器在编译时将会看到 math.h 的声明,但 Cython 不会去分析 math.h 和单独的定义。

4. 延伸

Cython 0.22 documentation

时间: 2024-10-12 03:59:31

Cython学习的相关文章

Python学习教程:用Cython加速Python代码,快到你想不到

如果你曾经用Python编写过代码,那么等待某些代码块执行的时间可能比您希望的要长.虽然有一些方法可以提高代码的效率,但它很可能仍然比C代码慢.这主要归结为一个事实:Python是一种动态编程语言,它将许多东西移动到C在编译期间负责的运行时. 不过,如果您像我一样喜欢用Python编写代码,并且仍然希望加快代码的速度,那么您可以考虑使用Cython.虽然Cython本身是一种独立的编程语言,但是很容易将其融入到您的工作流程中,例如Jupyter Notebook.在执行时,Cython将您的Py

初用Cython编写扩展模块

这篇博文还是讲关于提高Python运行效率的,这确实是一个值得去仔细研究一番的问题,这篇博文介绍完Cython后,还要接着介绍线程.进程和协程在提高Python代码运行效率起着怎样的作用,那么我的这个系列的博文基本上写完了. 首先要介绍一下各种*ython,太多了,什么python,pypy呀,等等,都是什么呢.这里简单的做个介绍. CPython:这是平时用的最广泛的,是用C语言实现的解释器,平时说的Python一般都是指CPython. Jython:用Java实现的的python解释器.

学习Python的一些Tips

0. Python安装 官网提供多种方式,一般Windows下直接安装exe即可:Linux下基本上自带python:另外也提供源码,也可自行编译: 若安装后无法使用,则检查一下环境变量是否设置正确. 额外:除了最主要的官网资料.文档外,Python的wiki也提供了很多有用的信息 1. Python相关源码 0) 标准库 1) PyPi包索引(可通过pip工具安装) 2) GitHub上的Python项目 3) Code activestate上面的Python代码片段 2. Python安装

scikit-learn学习日记(1)

最近开始学习使用scikit-learn,每天都写一下学到的东西,既能提示自己一天学了什么东西,也方便回顾. 在我的虚拟机Ubuntu上安装了scikit-learn,安装流程很简单 .由于我常用python所以我的Ubuntu虚拟机早就安装了pip.numpy.scipy.matplotlib.Cython依赖库. 源码地址:https://github.com/scikit-learn/scikit-learn 安装完依赖库后,在github上下载scikit-learn源码,cd到源码目录

[gevent源码分析] libev cython绑定core.pyx

gevent core就是封装了libev,使用了cython的语法,感兴趣童鞋可以好好研究研究.其实libev是有python的封装 pyev(https://pythonhosted.org/pyev/),不过pyev是使用C来写扩展的,代码巨复杂.在看core.pyx代码之前先学习一下 core.pyx用到的cython知识. 一: cython基础知识 1.cdef, def, cpdef的区别 cdef用于定义C中的函数,变量,如cdef int i;而def知识python中的函数定

Cython初窥

这篇关于Cython的文章主要是用来阐述什么是Cython,Cython的主要用途是什么.对于Cython的具体用法基本不涉及,因为我觉得了解它的主要用途以及它的优缺点,那么等到有使用场景的时候再来学习一下它的document就可以了. 1. Python的扩展模块(extention module) 我们知道可以用c.c++来扩展Python,这样做的目的就是为了把一些关键功能用更快.更高效的语言(c.c++)来实现,以提高Python程序的运行效率. 下面是一个示例: #include<Py

deep learning framework(不同的深度学习框架)

常用的deep learning frameworks 基本转自:http://www.codeceo.com/article/10-open-source-framework.html 1. Caffe 基于C++开发 2. Theano 大部分代码是使用CYthon开发的,主页有很详细的教程,在github上有Theano的软件包 基于theano派生了许多的深度学习python软件包:Keras.Lasagne 3. Torch7

Python版的Word2Vector -- gensim 学习手札 中文词语相似性度量

前言 相关内容链接: 第一节:Google Word2vec 学习手札 昨天好不容易试用了一下Google自己提供的Word2Vector的源代码,花了好长时间训练数据,结果发现似乎Python并不能直接使用,于是上网找了一下Python能用的Word2Vector,这么一找,就找到了gensim gensim(应该要翻墙): http://radimrehurek.com/gensim/models/word2vec.html 安装 gensim有一些依赖,首先请先确保你安装了这些东西: Py

深度学习库比较

  深度学习库比较 库名 主语言 从语言 速度 灵活性 文档 适合模型 平台 上手难易 开发者 模式 Tensorflo C++ cuda/python 中等 好 中等 CNN/RNN Linux,OSX 难 Google 分布式/声明式 Caffe C++ cuda/python/Matlab 快 一般 全面 CNN 所有系统 中等 贾杨清 声明式 PyTorc python C/C++ 中等 好 中等 - -- 中等 FaceBook   MXNet c++ cuda/R/julia 快 好