Cython
Python, C-Python, Cython代码与GIL的交互
from array import array import xwTest b = array('B') b.frombytes('abc'.encode()) print(b.tobytes()) # b'abc' print(b.tobytes().decode()) # 'abc' xwTest.test(b) cpdef test(unsigned char[:] arr): for i in range(arr.shape[0]): print(arr[i])
数组初始化
cdef int mom2calc[3] mom2calc[:] = [1, 2, 3] cdef int mom2calc[3][3] mom2calc[0][:] = [1, 2, 3] mom2calc[1][:] = [4, 5, 6] mom2calc[2][:] = [7, 8, 9]
可以用cdef定义python内置类型的变量,也可以是扩展类型的变量Numpy arrays cdef list eggs cdef dict events cdef str name cdef set unique_names C和python对于计算带符号正式操作的时候有很大的不同。例如-1 % 5在python中等于4 但是在C中等于-1。 当两个整数相除时,Python会检查分母是否为0 cimport cython @cython.cdivision(True) def divides(int a, int b): return a / b 使用cdef定义的函数可以被同一个源文件下的def函数和cdef函数调用。 但是Cython不允许一个cdef定义的函数被外部python代码直接调用。 定义函数的三种方式: def, cdef, cpdef, cpdef为混合类型 既可以被外部的python代码调用,也可以被Cython调用。 定义struct和union ctypedef struct mycpx: float real float imag ctypedef union uu: int a short a,b,c cdef mycpx a = mycpx(3.14, -1.0) cdef mypyx b = mycpx(real=2.718, imag=1.618) ctypedef不能再函数内部使用,必须在文件中出现才能使用。 定义宏 DEF E = 2.71828182845904 DEF PI = 3.141592653589793 定义扩展类型 cdef class Particle: cdef double mass, posotion, velocity def __init__(self, m, p, v): self.mass = m self.position = p self.velocity = v def get_momentum(self): return self.mass * self.velocity 继承和子类 cdef class CParticle(Particle): cdef double momentum def __init__(self, m, p, v): super(CParticle, self).__init__(m, p, v) self.momentum = self.mass * self.velocity cpdef double get_momentum(self): return self.momentum Cython提供了compile-time-annotations. 运行时间分析工具和编译注释为我们提供优化cython代码的一种方法。 $ cython --annotage integrate.pyx