【发布时间】:2013-04-13 09:45:18
【问题描述】:
我正在尝试使用 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,但没有从 Cython 调用 numpy Python 模块的开销仍然会使事情总体上更快。
我想调用的示例函数:
- 点积 (
np.dot) - 矩阵求逆 (
np.linalg.inv) - 矩阵乘法
- 转置(相当于 numpy 中的
x.T) - gammaln 函数(类似于
scipy.gammaln等价物,应该在 C 中可用)
我意识到,正如它在 numpy 邮件列表 (https://groups.google.com/forum/?fromgroups=#!topic/cython-users/XZjMVSIQnTE) 上所说,如果您在大型矩阵上调用这些函数,那么从 Cython 执行它是没有意义的,因为从 numpy 调用它只会导致大多数在 numpy 调用的优化 C 代码中花费的时间。然而,就我而言,我在小矩阵上多次调用这些线性代数运算——在这种情况下,反复从 Cython 回到 numpy 再回到 Cython 所带来的开销将远远超过实际计算 BLAS 操作所花费的时间。因此,对于这些简单的操作,我想将所有内容都保留在 C/Cython 级别,而不是通过 python。
我不希望通过 GSL,因为这会增加另一个依赖项,而且尚不清楚 GSL 是否得到积极维护。由于我假设代码的用户已经安装了 scipy/numpy,我可以放心地假设他们拥有与这些库一起使用的所有相关 C 代码,所以我只想能够利用该代码并调用它来自 Cython。
编辑:我找到了一个在 Cython (https://github.com/tokyo/tokyo) 中包装 BLAS 的库,它很接近但不是我想要的。我想直接调用 numpy/scipy C 函数(我假设用户已经安装了这些函数。)
【问题讨论】:
-
你做了
cimportnumpy,对吧? -
@LevLevitsky:是的,但我认为这不会改变重复调用
np.dot和其他需要返回 Python 的函数的间接成本。 -
cimport的想法是避免回到 Python... 但我只在文档中看到过,从未尝试过。 -
@LevLevitsky:不,这不正确。
-
我猜this 是我的意思。
标签: python numpy scipy cython blas