Я пишу модуль Cython, который предоставляет несколько типов расширений, которые используют оптимизированные функции cdef
.Некоторые из этих типов расширений (около 10, каждый из которых содержит около 200 строк кода) имеют абсолютно одинаковую структуру, но не вызывают одинаковые cdef
функции.Я хотел бы разложить мой модуль так, чтобы только один тип расширения мог обрабатывать все необходимые мне конфигурации.
Чтобы прояснить ситуацию, вот (очень глупый) пример структуры модуля, который я пишу:
cdef class A1:
cdef double x
def __init__(self, double x):
self.x = x
def apply(self):
self.x = f1(self.x)
cdef class A2:
cdef double x
def __init__(self, double x):
self.x = x
def apply(self):
self.x = f2(self.x)
cdef double f1(double x):
return x**1
cdef double f2(double x):
return x**2
...
и вид факторизованного кода, который я хотел бы получить:
cdef class A:
cdef int n
cdef double x
def __init__(self, double x, int n):
self.x = x
self.f = globals()[f'f{n}']
def apply(self):
self.x = self.f(self.x)
В чистом Python такую структуру легко настроить с помощью globals
или getattr
, но в Cython cdef
объекты (конечно) недоступны из Python, поэтомув globals()
.
Я полагаю, что реализация такого рода кода C
будет использовать указатели на функции, но я не могу найти, как это сделать внутри типа расширения Cython.На самом деле реальный вопрос заключается в том, можно ли добавить указатель на функцию cdef в качестве атрибута экземпляра (самостоятельно)?Если нет, то как я могу разложить этот тип кода без потери производительности (т.е. без изменения моих функций cdef)?