我必须使用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参数都将在编译时知道。
提前致谢。