初用Cython编写扩展模块

这篇博文还是讲关于提高Python运行效率的,这确实是一个值得去仔细研究一番的问题,这篇博文介绍完Cython后,还要接着介绍线程、进程和协程在提高Python代码运行效率起着怎样的作用,那么我的这个系列的博文基本上写完了。

首先要介绍一下各种*ython,太多了,什么python,pypy呀,等等,都是什么呢。这里简单的做个介绍。

CPython:这是平时用的最广泛的,是用C语言实现的解释器,平时说的Python一般都是指CPython。

Jython:用Java实现的的python解释器。

IronPython:用C#实现的python解释器。

RubyPython:用Ruby实现的Python解释器。

Brython:用Javascript实现的Python解释器。

PyPy:用rPython(是Python的一个子集)实现的python解释器。

Cython: 一个Python的超集,能够调用C语言的函数,允许你为你的Python代码写C扩展,允许你为                      你 的 Python代码加入静态类型,运行编译并达到接近C语言的性能。

IPython:跟其他版本完全不一样,这是一个Python的计算环境。为一些GUI工具集和浏览器体验等提供                支 持。

Psyco:已经停止维护了,发展成为现在的PyPy了。

PyObjc:Python和Objective-C语言直接的桥梁。这意味着能在你的Python代码中使用Objective-C                      的 库(包括创建一个OS X应用程序所需要的一切),反过来在Objective-C里面也可以使用                    Python的模块。

PyQt::同PyObjc帮你绑定OS X GUI组件类似,PyQt帮你绑定Qt应用程序框架,让你可以创建丰富的                 图  形界面,访问关系数据库等等。

pyjs (Pyjamas): Python中一个创建web和桌面应用程序的框架。包含一个Python-to-JavaScript的编                 译  器和其他一些工具。

Python 3000 (Py3k):Python 3.0的一个别名,2008年释出的一个主要版本,但是它并不向后兼容。

下面开始介绍Cython吧。前两篇博文介绍了利用Python对外接口,使用C/C++来提高运行效率(参见博文《初用C/C++扩展Python,提高性能》和《再探C/C++扩展Python》)。但是有个问题,对于对C/C++使用不是很熟练的人(比如我,虽然懂C和C++,但用的也是不是很熟练呀),用这种方法的话,费时又费力,就在这个时候Cython出现了,它可以把Python代码直接编译成C/C++代码,从而获得性能上的提升。

第一步肯定是安装,安装很简单,用pip安装,一条命令就可以搞定。

sudo pip install -U cython

如果想知道它怎么用,打开终端,输入cython,就会有相关命令帮助。如下图:

看看,它的命令相关的用法都已经告诉了,在此我就不过多介绍了,英文不好的,可以用谷歌翻译,一般都是可以理解的了的。下面随便写个python代码试用一下。代码如下:

#coding=utf-8
def is_primenumber(n):
    if n <= 1:
        return False
    if n == 2:
        return True
    if n == 3:
        return False
    for i in xrange(2,n//2 + 1):
        if n % i == 0:
            return True
    return False

还是判读一个正整数是不是素数,文件名为good.py。根据上图中cython命令使用方法,打开终端,切换到文件所在目录,执行如下命令

cython good.py

然后就在当前目录生成一个名为good.c的文件,当然你也可以自己指定路径及文件名。根据上图的命令使用方法提示,我们可以用参数o。如下:

cython good.py -o /home/liuonghua/good1.c

那么会将good.py编译成为等价的c/c++代码会拷贝到/home/liulong/目录下的good1.c文件下(如果该文件不存在会自动创建)。我们可以打开这个good.c文件看看,3000多行呀,一个只有十五六行的Python代码被编译成了3000多行的C/C++代码。那怎么在这3000多行代码中找到对应的用Python代码写的代码呀?在文件里搜索“is_primenumber”,可以找的到,由于代码比较长,在此不贴了,至于cython将python代码编译成c/c++代码的机理是什么,有时间研究一番后再和大家分享我的学习经验。

竟然以及被编译成立.c文件,那么接下来的操作和上篇博文《初用C/C++扩展Python,提高性能》一样,将它编译成.so文件(怎么编译,可参考上篇博文),然后拷贝到python2.7/dist-packages目录下,然后就可以利用该模块了。在此不过多阐述,直接贴上我的测试运行效率的结果结果。

代码如下:

#coding=utf-8
from good import is_primenumber
import datetime
def is_prime(n):
    if n <= 1:
        return False
    if n == 2:
        return True
    if n == 3:
        return False
    for i in xrange(2,n//2 + 1):
        if n % i == 0:
            return True
    return False

t0 = datetime.datetime.now()
a = is_prime(10)
t1 = datetime.datetime.now()
b = is_primenumber(10)
t2 = datetime.datetime.now()
print t2-t1,t1-t0

结果如下:

性能是不是提高了很多。今天就介绍到这儿,明天在介绍Cython直接调用c函数。

时间: 2024-10-12 10:07:42

初用Cython编写扩展模块的相关文章

编写高质量Python程序的91个建议(转)

建议1:理解Pythonic概念 Pythonic可以定义为:充分体现Python自身特色的代码风格. 推荐阅读:PEP 8 – Style Guide for Python Code 建议2:编写Pythonic代码 避免只用大小写来区分不同的对象. 避免使用容易引起混淆的名称如字母'O'的大小写和字母'L'的小写'l'. 不要害怕过长的变量名,变量名易于理解最重要. 建议3:理解Python与C语言的不同之处 "缩进"与"{ }" C.C++.Java等语言使用

使用C语言为python编写动态模块(3)--在C中实现python中的类

楔子 这次我们来介绍python中的类型在C中是如何实现的,我们在C中创建python的int对象,可以使用PyLong_FromLong.创建python的list对象可以使用PyList_New,那么如何在C中构建一个python中的类呢? 对于构建一个类,我们肯定需要以下步骤: 创建一个类扩展 添加类的参数 添加类的方法 添加类的属性,比如可以设置.获取属性 添加类的继承 解决类的循环引用导致的内存泄露问题和自定义垃圾回收 前面几个步骤是必须的,但是容易把最后一个问题给忽略掉.我们在pyt

利用C++ Boost编写扩展Python模块

Python很强大,但已有的模块可能满足不了人民日益增长的物质文化需求,于是有时需要编写扩展模块进行完善. 可行的方案有很多:SWIG.Weave.ctypes.BOOST-- BOOST无疑是开发最快的一种方案.下面介绍下最简单的C++ helloworld程序如何变为Python的一个模块. 1. 安装Python.Boost 这里用Linux环境.Python和Boost都用源码安装,网址为: Python2.6:https://www.python.org BOOST1.57.0:htt

Python3快速入门(十七)——Python扩展模块开发

Python3快速入门(十七)--Python扩展模块开发 一.Python扩展模块 1.Python扩展模块简介 Python与C/C++交互的方案有多种,如Python C API,SWIG,SIP,ctypes,cpython,cffi,boost.python等.Python只是一个语言规范,有很多具体实现,CPython是标准Python,由C编写,Python脚本被编译成CPython字节码,然后由虚拟机解释执行,垃圾回收使用引用计数,Python与C/C++混合编程本质是基于CPy

使用C语言为python编写动态模块(1)--从底层深度解析python中的对象以及变量

楔子 我们知道可以通过使用C语言编写动态链接库的方式来给python加速,但是方式是通过ctypes来加载,通过类CDLL将动态链接库加载进来得到一个对象之后,通过这个对象来调用动态链接库里面的函数.那么问题来了,我们可不可以使用C语言为python编写模块呢?然后在使用的时候不使用ctypes加载动态库的方式,而是通过python的关键字import进行加载. 答案是可以的,我们知道可以通过编写py文件的方式来得到一个模块,那么也可以使用C语言来编写C源文件,然后再通过python解释器进行编

使用C语言为python编写动态模块(2)--解析python中的对象如何在C语言中传递并返回

楔子 编写扩展模块,需要有python源码层面的知识,我们之前介绍了python中的对象.但是对于编写扩展模块来讲还远远不够,因为里面还需要有python中模块的知识,比如:如何创建一个模块.如何初始化python环境等等.因此我们还需要了解一些前奏的知识,如果你的python基础比较好的话,那么我相信你一定能看懂,当然我们一开始只是介绍一个大概,至于细节方面我们会在真正编写扩展模块的时候会说. 关于使用C为python编写扩展模块,我前面还有一篇博客,强烈建议先去看那篇博客,对你了解Pytho

Python实例浅谈之三Python与C/C++相互调用

一.问题 Python模块和C/C++的动态库间相互调用在实际的应用中会有所涉及,在此作一总结. 二.Python调用C/C++ 1.Python调用C动态链接库 Python调用C库比较简单,不经过任何封装打包成so,再使用python的ctypes调用即可. (1)C语言文件:pycall.c /***gcc -o libpycall.so -shared -fPIC pycall.c*/ #include <stdio.h> #include <stdlib.h> int f

Python的 GUI 框架

Python的 GUI 框架 Tkinter Python内嵌的gui环境,使用TCL实现,python IDLE由Tkinter实现 历史悠久,perl中有对应的perlTk.Python标准安装包中包含Tkinter,易学易用,方便创建简单GUI. 跨平台 布局全靠代码实现,15种常用部件,效果简陋 Wxpython 跨平台,由C++编写 Python的扩展模块,使用前需要安装 遵循LGPL协议,自由软件,商用许可 文档少,遇到问题不容易解决 代码布局控件,不直观 Pygtk Python对

Python与C/C++相互调用(转)

原文链接 作者 一.问题 Python模块和C/C++的动态库间相互调用在实际的应用中会有所涉及,在此作一总结. 二.Python调用C/C++ 1.Python调用C动态链接库 Python调用C库比较简单,不经过任何封装打包成so,再使用python的ctypes调用即可.(1)C语言文件:pycall.c /***gcc -o libpycall.so -shared -fPIC pycall.c*/ #include <stdio.h> #include <stdlib.h>