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

产物如链式: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参数在编译时都是已知的 .

提前致谢 .