第二步 是使用标准的 C、C++ 编译器将第一步得到的 C、C++ 代码进行编译并生成标准的扩展模块,并且这个扩展模块是依赖特定的平台的。如果是在 Linux 或者 Mac OS,那么得到的扩展模块的后缀名为 .so,如果是在 Windows 平台,那么得到的扩展模块的后缀名为 .pyd(扩展模块 .pyd 本质上是一个 DLL 文件)。不管是什么平台,最终得到的都会是一个成熟的 Python 扩展模块,它是可以直接被 Python 解释器进行 import 的。
注意: Cython编译器是一种源到源的编译器,并且生成的扩展模块也是经过高度优化的,因此Cython生成的C代码编译得到的扩展模块比手写的C代码编译得到的扩展模块运行的要快并不是一件稀奇的事情。因为 Cython 生成的 C 代码是经过高度精炼,所以大部分情况下比手写所使用的算法更优,而且 Cython 生成的 C 代码支持所有的通用 C 编译器,生成的扩展模块同时支持许多不同的 Python 版本。
<module 'fib'from'/data/aibox/kaifang/trans/cython/fib.so'>
Traceback (most recent call last):
File "/data/aibox/kaifang/trans/cython/test_fib.py", line 16,in<module>print(fib.fib("xx"))# 6765.0
File "fib.pyx", line 14,in fib.fib
for i inrange(n):
TypeError: an integer is required
55.0
这是一个扩展模块
2.4. 引入C源文件
除此之外我们还可以嵌入 C、C++ 的代码,我们来看一下。
// cfib.hdoublecfib(int n);// 定义一个函数声明//cfib.cdoublecfib(int n){int i;double a=0.0, b=1.0, tmp;for(i=0; i<n;++i){
tmp = a; a = a + b; b = tmp;}return a;}// 函数体的实现
然后是.pyx文件:
# 通过 cdef extern from 导入头文件, 写上里面的函数
cdef extern from"cfib.h":
double cfib(int n)# 然后 Cython 可以直接调用deffib_with_c(n):"""调用 C 编写的斐波那契数列"""return cfib(n)
选择题
1.使用printf函数打印一个double类型的数据,要求:输出为10进制,输出左对齐30个字符,4位精度。以下哪个选项是正确的?
A %-30.4e B %4.30e C %-30.4f D %-4.30f
对于 %m.nf ,double对应%f.要求打印…