我正在尝试使用 Cython 的 numpy 中可用的点积、矩阵求逆和其他基本线性代数运算。numpy.linalg.inv
(反转)、numpy.dot
(点积)、X.t
(矩阵/数组的转置)等函数。从 Cython 函数调用有很大的开销,numpy.*
并且函数的其余部分是用 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
从 Cython 调用 Python 模块的开销仍然会使事情总体上更快。
我想调用的示例函数:
- 点积 (
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 调用它只会导致大部分时间花在 numpy 调用的优化 C 代码中。但是,就我而言,我对小矩阵上的这些线性代数运算有很多调用——在这种情况下,重复从 Cython 回到 numpy 再回到 Cython 所引入的开销将远远超过实际计算运算所花费的时间布拉斯。因此,对于这些简单的操作,我想将所有内容都保留在 C/Cython 级别,而不是通过 python。
我不想通过 GSL,因为这增加了另一个依赖项,而且还不清楚 GSL 是否得到积极维护。由于我假设代码的用户已经安装了 scipy/numpy,我可以放心地假设他们拥有与这些库一起使用的所有相关 C 代码,所以我只想能够利用该代码并调用它来自赛通。
编辑:我在 Cython ( https://github.com/tokyo/tokyo ) 中找到了一个包含 BLAS 的库,它很接近但不是我想要的。我想直接调用 numpy/scipy C 函数(我假设用户已经安装了这些函数。)