有没有一种方法可以为cython结构定义运算符重载?

时间:2019-06-22 01:00:20

标签: python-3.x performance cython

我需要在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

是否有一种方法可以定义可在结构中使用的+-/*之类的运算符?

0 个答案:

没有答案