Cython: 快速入门

时间:2023-01-19 21:00:44

1. Cython是什么?

它是一个用来快速生成Python扩展模块(extention module)的工具,语法是Python和c的混血。在Cython,C里的类型,如int,float,long,char*等都会在必要的时候自动转成python对象,或者从python对象转成C类型,在转换失败时会抛出异常,这正是Cython最神奇的地方。另外,Cython对回调函数的支持也很好。Cython作为一个Python的编译器,在科学计算方面很流行,用于提高Python的速度,通过OpenMPI库还可以进行吧并行计算。

2. 安装

  Cython安装非常方便,因为一般像Anaconda、Python(x,y)等都附带了,如果没有用这些,也可以自己安装。附上安装教程 http://docs.cython.org/src/quickstart/install.html

3. 例子

cdef extern from"stdio.h":
extern int printf(const char *format, ...)
def SayHello():
printf("hello,world\n")

代码非常简单,就是调用了C函数printf打印hello,world.

简单解释

(1) cdef 定义类c的函数

(2) 可以引入c库中的模块以及其中的函数,并且被调用

4 运行

(1) 利用python的distutils

上面的代码被命令为hello.pyx,在同级目录下创建一个setup.py

from distutils.core import setup
from Cython.Build import cythonize
from distutils.extension import Extension setup(
name = 'Hello world app',
ext_modules = cythonize([
Extension("hello",["hello.pyx"]),
]),
)

然后

>>>python setup.py build

>>>python setup.py install

(2)  自己写Makefile

写Makefile的好处就是可以知道编译的实质:

下面是用于Windows下编译的Makefile,Makefile内容如下:

ALL :helloworld.pyd

helloworld.c : helloworld.pyx

cython -o helloworld.c helloworld.pyx

helloworld.obj :helloworld.c

cl -c -Id:\python27\include helloworld.c

helloworld.pyd :helloworld.obj

link /DLL /LIBPATH:d:\python27\libshelloworld.obj /OUT:helloworld.pyd

执行命令:

set PATH=D:\Python27\Scripts;%PATH%

nmake

进行编译,会在根目录下生成helloworld.pyd

linux下的Makefile和Windows下的类似,只是编译器不同而己,另外,生成的文件名为:helloworld.so,而不是helloworld.pyd