-
Cython
Cython
是包含C数据类型的Python
。python
是脚本语言;cpython
是用c
来实现的python
的解释器;cython
是另外一种编程语言,介于python
和c
之间;
实际上
cython
的设计初衷也是这样,既要利用python
快捷的编程速度,又要有c
语言的运行效率。cython
和python
的一个显著区别就是,cython
的所有变量都要明确声明变量类型——仅仅这一点,相同的程序,cython
的运行效率就要比python
的高35%!虽然
cython
是一种独立的编程语言,不过貌似大家不用他独立的编写程序,而是用它来编写python
的c扩展
(用c高效实现某些程序,再给python调用
) -
Cython输出Hello World
-
创建test.py
文件中内容如下:
def say_hello(): print("Hello World")
此环节官方文档中使用的是
test.pyx
文件,内容一样。.pyx
文件是由Cython
编程语言 “编写” 而成的Python
扩展模块源代码文件。pyx
文件是python
的c
扩展文件,代码要符合cython
的规范,用什么编辑器写都行。 -
创建setup.py
上面的
.py
或pyx
文件还仅仅是源代码文件,要想被python
调用、要想运行,仅仅写了源代码还是不够的。具体来说,还要转成.c
或者.c++
的文件,并且再进一步转成.pyd
文件。pyd
文件才是可以直接使用的文件。为了达到上述目的,就要写一个setup.py
脚本,如下:from distutils.core import setup from Cython.Build import cythonize setup( ext_modules = cythonize("test.py") )
-
构建Cython文件
通过命令行,进入文件所在路径,运行下述代码:
python setup.py build_ext --inplace
build_ext
是指明python
生成C/C++
的扩展模块(build C/C++ extensions (compile/link to build directory)
);
--inplace
表示 将编译后的扩展模块直接放在与test.py
同级的目录中生成一个
helloworld.pyd
文件,运行中可能出现两个错误: -
在Python中运行
在
Python
界面或CMD >> python
,导入新建的文件import test as ts ts.say_hello()
其中,
cmd
要先转到test
所在目录,上述代码才能成功。
-
-
解释
上述过程分为两部分:
- .py文件使用Cython被编译为.c文件;
- .c文件使用C编译器生成.pyd(windos)或.so(linux)文件
不像
Python
语言可直接解释使用的.py
文件,.py
(或.pyx
) 文件必须先被编译成.c
文件,再编译成.pyd
(Windows
平台) 或.so
(Linux
平台) 文件,才可作为模块import
导入使用。.c
文件是test.py
转化后的C代码
文件,比较大;.pyd
是Python
的动态链接库,在使用import
时会加载;.pyc
是字节码,二进制,就是Python虚拟机直接运行的代码;build
目录中包含编译过程中生成的临时文件。.pyx文件
是python
的c扩展文件
,代码要符合cython
的规范,用什么编辑器写都行。
## References