cdef
cdef是告诉编译器这条语句是C类型的语句,例如:
#pysum.pyx
cdef int Csum(int a, int b):
return a + b
它和真正的C语言定义的函数有一些区别,例如c用{}
包裹函数体,而cdef用:
定义。
python中不能直接调用cdef定义的函数(直接调用cdef定义的函数会出现ImportError:cannot import name ‘Csum’),但可以通过python定义函数的形式进行调用它:
#pysum.pyx
def pysum(int a, int b):
return Csum(a,b)
- cdef,cpdef和def的区别:cdef定义的函数其实是C语言函数的原型,其只能被Python的函数进行调用,而不能被Python直接调用;cpdef除了能实现cdef的功能,其也能被python直接调用,但是变量的类型必须在C语言和Python中都存在才可以(尽量避免使用cpdef);def定义的函数可以直接被Python可调用,def定义的函数内也可调用cdef定义的函数。
python内部类型
在cython中可以使用python内部类型来声明变量:
cdef list parts, country=['中国','America']
cdef dict d
cdef str name
cdef set coll
cdef object strs=['中国','America']
类型强转
cython类型强转和c语言相似,只是把圆括号转换为尖括号:
cdef int *ptr_i = <int*>v
如果我们不确定要转换的类型或者想要cython在转换前检查类型,应该使用检查转换操作符:
def cast_to_list(a):
cdef list cast_list = <list?>a #多加了一个问号
print(type(a))
print(type(cast_list))
struct
c语言中定义结构体为:
struct mystruct{
int a;
float b;
};
而在cython中,使用cdef来进行结构的声明:
cdef struct mystruct:
int a
float b
#or
ctypedef struct mystruct:
int a
float b
不管是用cdef还是ctypedef定义结构,都可以使用这个结构体来声明其他变量: