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