【问题标题】:Fast subsequent multiplication of many matrices in pythonpython中许多矩阵的快速后续乘法
【发布时间】:2021-04-19 16:56:32
【问题描述】:

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

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

特别是-

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

提前致谢。

【问题讨论】:

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

标签: python performance matrix matrix-multiplication


【解决方案1】:

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

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

Numpy 非常适合此类问题,因为它已经过优化。 (并且部分在 C 中)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 2011-11-30
    • 2021-02-11
    • 2016-06-25
    • 2015-04-07
    • 1970-01-01
    相关资源
    最近更新 更多