pxd文件
在Cython中,可将指定的函数和类声明放在pxd文件中,提供给其他的模块复用,通过cimport语句访问。以实现切比雪夫距离函数为例,看一下怎么pxd文件是怎么使用的。
首先在mathlib.pyx文件中实现max和min函数:
1 | #!python |
在mathlib.pxd中声明函数max和min的原型:
1 | #!python |
新建一个模块,来使用mathlib,在distancee.pyx文件中导入模块mathlib,并实现切比雪夫距离函数:
1 | #!python |
接下来只需要在使用Python标准打包工具distutils
来编译以上Cython代码,在setup.py文件中写入:
1 | from distutils.core import setup |
执行setup.py脚本:
1 | (Dev) $ python setup.py build_ext --inplace |
编译成功后的目录结构:
1 | (Dev) $ tree -h |
此时在解释器中运行写好的切比雪夫函数:
1 | >>> import distance |
数组
Cython中声明数组:
1 | cdef double arr[10] |
可以使用标准索引获取或者修改数组元素
1 | arr[0] = 1.0 |
numpy
Cython中提供了numpy模块(与Python模块numpy不同),直接操作Numpy数组的内存区域,极大的提升性能。
声明一个Numpy数组,可使用数据类型ndarray,在方括号中指定类型和维数,这种方法被称为缓冲区语法(buffer syntax):
1 | cimport numpy as cnp |
接下来以一个例子来比较Cython和Python的numpy计算速度,首先是Python中的numpy版本:
1 | In [2]: %%cython |
使用Cython中numpy的ndarray类型,使用ndarray声明变量c_arr后,就可将一个使用Python模块numpy创建的数组赋给它。
1 | In [3]: %%cython |
接下来对比两个函数的执行时间:
1 | In [4]: %timeit numpy_bench_c() |
代码分析
Cython提供了一种名为注释视图(annotated view)的功能,在Jupyter中可以通过传递--annotate
选项来显示Cython的代码分析,图中的颜色越深就越表示与解析器调用的相关程度越高,如下图:
也可以通过命令行执行生成html文件:
1 | cython -a test_annotate.pyx |
今天的学习就到这里了😛