Cython入门(一)计算斐波那契数列
本文将会通过一个简单的例子来作为Cython系列的入门文章。
Cython介绍
Cython
的本质可以总结为:Cython是具有C数据类型的Python。
Cython
就是Python
:几乎所有的Python代码都是有效的Cython代码。(有少量例外,但这里我们先承认这个结论。)Cython
的编译器会把代码转换成等效于调用Python/C
API的C代码。
但是Cython远不止于此,因为它的参数和变量可以被声明为具有C数据类型。我们可以自由地混用操作Python值和C值的代码,而Cython会帮助我们自动转换需要转换的地方。Python中的引用计数保存和错误检查也是自动的,而且Python的异常处理机制,包括try-except和try-finally同样可行——即使是在操作C数据时。
总的来说,Cython
可以让我们方便地:
- 用 Python 的语法混合编写 Python 和 C/C++ 代码,提升 Python 速度
- 调用 C/C++ 代码
下面我们将会通过一个简单的计算斐波那契数列的例子来了解Cython
的使用方式。
一个简单的例子:计算斐波那契数列
- 原始的python代码
1 |
|
- pyx文件
1 |
|
可以看到,pyx文件的写法中加入了C语言的数据类型,这就是Cython
的程序代码了,看上去与Python十分相似,这无疑是很方便学习的。
注意: cdef定义的_calc_fibonacci_number_c函数,我们将无法通过Python的模块调用方式来调用,因此,我们又实用了def来定义Python中的calc_fibonacci_number_c函数。
- 编译文件: setup.py
1 |
|
- 编译
运行命令:
1 |
|
--inplace可用-i代替。
编译完后会生成同名的以.c和.so文件为后缀的文件。(Linux系统为so文件,Windows为pyd文件)
- 测试
1 |
|
运行结果:
1 |
|
在笔者的Windows电脑上运行,Cython的运行时间比Python快大约60倍,这无疑是让人惊讶的。
参考文献
- Cython 基本用法: https://zhuanlan.zhihu.com/p/24311879
- HatBoy's Github Pages': https://hatboy.github.io/page/4/
- OReilly.Cython-A-Guide-for-Python-Programmers.pdf: http://www.jyguagua.com/wp-content/uploads/2017/03/OReilly.Cython-A-Guide-for-Python-Programmers.pdf
欢迎关注我的公众号NLP奇幻之旅,原创技术文章第一时间推送。
欢迎关注我的知识星球“自然语言处理奇幻之旅”,笔者正在努力构建自己的技术社区。