我必须使用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参数在编译时都是已知的 .
提前致谢 .