基于np.dot

时间:2018-04-14 15:41:44

标签: python numpy cython

我必须使用cython优化python代码。 代码中有很多矢量和矩阵点积,这是优化过程的关键。

产品 in chain ,如: A.B.C.D.e 其中e可以是向量,A,B,C,D是矩阵。 我正在使用numpy来表示所有对象。

最初,我使用numpy.linalg.multi_dot。我读到here,multi_dot比np.dot更有效,因为它试图优化操作顺序。 但是,在我的情况下,矩阵很小,使用multi_dot比执行np.dot链慢大约10倍。

然而,multi_dot的语法很好,并且代码中有数千行代表不同数量的矩阵和向量的产品。使用np.dot重写所有这些行对于其他开发人员来说实际上会失去可读性。

基于np.dot创建一个类似于multi_dot的纯python很容易,但我想对它进行Cython化。事实上,我不知道在编译时作为multi_dot的参数给出的矩阵的数量迫使我调用python解释器。 这是我写的代码:

@cython.boundscheck(False)
@cython.wraparound=False
cpdef mymultidot(np_array_list):
    cdef int n=len(np_array_list)
    R=np_array_list[0]
    for i in range(1,n):
        R=np.dot(R,np_array_list[i])

有没有办法在这个函数中减少python调用?特别是,在执行时没有推断出np_array_list的类型?

也许在编译时推导出类似于list_of(np.ndarray [np.float_t,ndim = 2])的np_array_list类型?但不知道列表的大小会使其变得困难。

在Cython中有没有办法让方法具有相同的名称但不是像C / C ++中那样的参数?这样我就可以创建

mymultidot( np.ndarray[np.float_t, ndim=2], np.ndarray[np.float_t, ndim=2], np.ndarray[np.float_t, ndim=2])

mymultidot( np.ndarray[np.float_t, ndim=2], np.ndarray[np.float_t, ndim=2])

mymultidot( np.ndarray[np.float_t, ndim=2], np.ndarray[np.float_t, ndim=1])

......等等?

编写代码中存在的所有版本将会很长,但所有multi_dot参数都将在编译时知道。

提前致谢。

0 个答案:

没有答案