Я пытаюсь выполнить некоторую числовую обработку типов массивов в Postgres. Я обнаружил, что могу использовать библиотеку Numpy в Postgres PL / Python, но операция выполняется слишком медленно для моих целей и намного медленнее, чем в Python напрямую или с использованием расширения C.
Я подозреваю, что могут возникнуть издержки при переходе из Postgres Array Type -> Python List -> Numpy Arrray и затем в обратном порядке.
Для тестирования (и, возможно, исправления) я пытаюсь создать расширение C, которое пропустило бы прохождение по списку Python и конвертировало бы непосредственно из Postgres Array в Numpy Array и наоборот.
Я создал расширение C, которое определяет следующее:
CREATE FUNCTION arr_to_np(val internal) RETURNS internal LANGUAGE C AS 'MODULE_PATHNAME', 'arr_to_np';
CREATE FUNCTION np_to_arr(val internal) RETURNS real[] LANGUAGE C
AS 'MODULE_PATHNAME', 'np_to_arr';
CREATE TRANSFORM FOR real[] LANGUAGE plpythonu (
FROM SQL WITH FUNCTION arr_to_np(internal),
TO SQL WITH FUNCTION np_to_arr(internal)
);
Модуль загружается без проблем, но когда я пытаюсь использовать его в функции
CREATE FUNCTION fn (a integer[])
RETURNS integer
TRANSFORM FOR TYPE real[]
AS $$ return a $$ LANGUAGE plpythonu;
Я получаю: ОШИБКА: преобразование для реального типа языка "plpythonu" не существует
Я предполагаю, что преобразование пытается быть применено к базовому «реальному» типу, а не к массиву. Есть ли способ указать преобразования специально для массивов?