我需要在cython中创建矢量表示,并希望它具有最佳性能,这导致我使用cython结构而不是cdef类,因为我不希望任何python开销。
我创建了一个封装x,y和z分量的结构,并添加了辅助函数来构造和执行这些向量的数学运算。 我仍然可以进行很多优化。
我有这个结构和“构造函数”:
ctypedef struct R3Vector:
double x, y, z
cdef inline R3Vector new_vector(double x, double y, double z) nogil:
cdef R3Vector ret
ret.x = x
ret.y = y
ret.z = z
return ret
我有这个“添加”方法:
cdef inline R3Vector add_vectors(R3Vector a, R3Vector b) nogil:
cdef R3Vector ret
ret.x = a.x + b.x
ret.y = a.y + b.y
ret.z = a.z + b.z
return ret
所以添加两个向量看起来像这样:
cdef R3Vector a = new_vector(10.0, 5.0, 2.5)
cdef R3Vector b = new_vector(8.0, 2.0, 3.1)
cdef R3Vector sum = add_vectors(a, b)
但是我真的不喜欢这些方法在各处被调用。我希望它不使用cdef类就更像python:
cdef R3Vector a = R3Vector(10.0, 5.0, 2.5)
cdef R3Vector b = R3Vector(8.0, 2.0, 3.1)
cdef R3Vector sum = a + b
是否有一种方法可以定义可在结构中使用的+-/*
之类的运算符?