Есть ли способ определить перегрузки операторов для структур Cython? - PullRequest
0 голосов
/ 22 июня 2019

Мне нужно создать векторное представление в 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)

Но мне действительно не нравится, как эти методы вызываются повсюду. Я хотел бы, чтобы он был более похож на python без использования классов cdef:

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

есть ли способ определить операторы типа +-/*, которые работают в структурах c?

...