Cython


Cython基本用法

Typed Memoryviews

Python, C-Python, Cython代码与GIL的交互

Cython nogil

array - 高效的数值数组

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]

CSDN-Cython专题

用Cython写高性能的数组操作

可以用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