Я пытаюсь использовать точечные продукты, инверсию матрицы и другие основные операции линейной алгебры, доступные в numpy от Cython. Такие функции, как numpy.linalg.inv
(инверсия), numpy.dot
(точечный продукт), X.t
(транспонирование матрицы/массива). Там большие накладные расходы для вызова numpy.*
из функций Cython, а остальная часть функции написана в Cython, поэтому я хотел бы избежать этого.
Если я предполагаю, что у пользователей установлен numpy
, есть ли способ сделать что-то вроде:
#include "numpy/npy_math.h"
как extern
, и вызывать эти функции? Или, альтернативно, напрямую вызывайте BLAS (или что это такое, что numpy вызывает эти основные операции)?
Чтобы привести пример, представьте, что у вас есть функция в Cython, которая делает много вещей и, в конце концов, должна сделать вычисление, включающее точечные продукты и обратные матрицы:
cdef myfunc(...):
# ... do many things faster than Python could
# ...
# compute one value using dot products and inv
# without using
# import numpy as np
# np.*
val = gammaln(sum(v)) - sum(gammaln(v)) + dot((v - 1).T, log(x).T)
как это можно сделать? Если там уже есть библиотека, которая реализует их в Cython, я также могу ее использовать, но ничего не нашел. Даже если эти процедуры менее оптимизированы, чем BLAS напрямую, не имея накладных расходов на вызов numpy
модуля Python от Cython, все равно будет делать все быстрее.
Примеры функций, которые я бы назвал:
- dot product (
np.dot
) - инверсия матрицы (
np.linalg.inv
) - матричное умножение
- принимает транспонирование (эквивалентно
X.t
в numpy) - Функция gammaln (например, эквивалент
scipy.gammaln
, который должен быть доступен в C)
Я понимаю, как он говорит в списке рассылки numpy (https://groups.google.com/forum/?fromgroups=#!topic/cython-users/XZjMVSIQnTE), что, если вы вызываете эти функции на больших матрицах, нет смысла делать это из Cython, так как вызов его из numpy приведет к большей части времени, затраченного на оптимизированный код C, который вызывает numpy. Однако в моем случае у меня много вызовов к этим операциям линейной алгебры на малых матрицах - в этом случае накладные расходы, вводимые путем повторного перехода от Cython обратно к numpy и обратно в Cython, намного перевесят время, затраченное на вычисление операции из BLAS. Поэтому я хотел бы сохранить все на уровне C/Cython для этих простых операций и не проходить через python.
Я бы предпочел не проходить через GSL, поскольку это добавляет еще одну зависимость, и поскольку неясно, активно ли GSL. Поскольку я предполагаю, что у пользователей кода уже установлен scipy/numpy, я могу с уверенностью предположить, что у них есть все связанные с ним C-коды, которые идут вместе с этими библиотеками, поэтому я просто хочу иметь возможность использовать этот код и называть его от Китона.
edit. Я нашел библиотеку, которая обертывает BLAS в Cython (https://github.com/tokyo/tokyo), который близок, но не то, что я ищу для. Я хотел бы вызвать функции numpy/scipy C напрямую (я предполагаю, что пользователь установил эти настройки.)