Cython中,声明数据类型的主要是使用cdef
语句,比如声明变量、函数和扩展静态类型等。
变量
首先启动Jupyter notebook,并导入Cython扩展:
1 | $ jupyter notebook |
声明变量类型时,在变量名前加入关键字cdef
和类型,同一cdef
语句中,可声明多个变量,还可对变量进行初始化,比如:
1 | cdef int i |
声明类型后,将有严格的类型检查,比如:
1 | In [2]: %%cython |
该种行为将导致报错:
1 | Error compiling Cython file: |
当需要强制类型转换时,只需要使用<目标类型>
:
1 | In [2]: %%cython |
以Fibonacci为例,看一下使用Cython后的速度提升:
1 | In [2]: %%cython |
函数
Cython中的函数,必须使用cdef
语句声明函数的返回类型:
1 | cdef int max_cython(int a, int b): |
但该种方式只能在Cython中使用,不过Cython可以定义在Python中调用且可转换为高性能C语言函数的函数,此时使用关键字cpdef
将生成两个版本:可供解释器使用的Python版本;可在Cython中使用的快速的C语言函数:
1 | cdef int max_cython(int a, int b): |
类
声明扩展类型,需要使用cdef class
语句,显式地声明要在编译期间使用的变量的类型。在类方法中访问声明的属性时,Cython将绕过开销很大的属性查找,直接访问底层C语言结构体中的指定字段。如果想要在Python代码中访问属性,必须在属性声明中使用限定符public或readonly。
1 | In [5]:%%cython |
Cython中有关变量、函数、类的学习暂时就这些😃