Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中多个矩阵的快速后续乘法_Python_Performance_Matrix_Matrix Multiplication - Fatal编程技术网

python中多个矩阵的快速后续乘法

python中多个矩阵的快速后续乘法,python,performance,matrix,matrix-multiplication,Python,Performance,Matrix,Matrix Multiplication,我必须通过许多其他矩阵的有序乘法生成一个矩阵(物理学中的传播子)。每个矩阵的大小约为(30,30),所有实项目(浮动),但不是对称的。要相乘的矩阵数在1e3到1e5之间变化。每个矩阵与前面的矩阵只是略有不同,但它们不是可交换的(最后我需要所有这些非可交换乘法的乘积)。每个矩阵都有特定的时间片,所以我知道如何独立地生成每个矩阵,无论它们在乘法序列中的什么位置。最后,我必须生成许多这样的矩阵传播子,因此任何性能增强都是受欢迎的 python中实现这种矩阵乘法最快的算法是什么 特别是- 如何构建它?

我必须通过许多其他矩阵的有序乘法生成一个矩阵(物理学中的传播子)。每个矩阵的大小约为(30,30),所有实项目(浮动),但不是对称的。要相乘的矩阵数在1e3到1e5之间变化。每个矩阵与前面的矩阵只是略有不同,但它们不是可交换的(最后我需要所有这些非可交换乘法的乘积)。每个矩阵都有特定的时间片,所以我知道如何独立地生成每个矩阵,无论它们在乘法序列中的什么位置。最后,我必须生成许多这样的矩阵传播子,因此任何性能增强都是受欢迎的

python中实现这种矩阵乘法最快的算法是什么

特别是-

  • 如何构建它?有快轴等吗?矩阵行/列的首选尺寸
  • 假设内存不是问题,是在乘法之前分配和构建所有矩阵,还是在每个时间步生成每个矩阵?在乘法之前将每个矩阵存储在专用变量中,或者在需要时生成并直接乘法
  • 生成矩阵时函数调用开销的累积影响
  • 正如我所知道的,如何构建它们,是否应该将它们并行化?例如,可以从序列的开始和结束创建批处理序列,将它们并行相乘,然后在结束时以适当的顺序相乘结果
  • 是否最好使用numpy以外的模块?Numba会有用吗?或者其他一些有效的方法就地编译到C,或者使用优化的外部库?(如果有,请提供参考,我没有这方面的经验)

提前谢谢。

我认为矩阵乘法不会花费太多时间。所以,我会在一个循环中完成。组装可能是这里成本最高的部分

如果你有更大的矩阵,一个map-reduce方法可能会有帮助。(拆分矩阵集,对每个矩阵集应用矩阵乘法,并对生成的矩阵执行相同操作)

Numpy对于这样的问题是非常好的,因为它是非常优化的。(部分为C)


只需测试矩阵乘法需要多少时间,组装需要多少时间。结果应该指出您需要优化的地方。

对于30x30,BLAS调用肯定是最快的方法。使用Numba,您只能减少开销。这是一个例子:在非常小的矩阵上,可以节省很多时间。同样重要的是尽可能减少内存分配的数量,并考虑CPU缓存的使用。我会及时生成它们,然后计算点积。