【问题标题】:Fastest way to compute matrix dot product计算矩阵点积的最快方法
【发布时间】:2017-05-08 20:49:01
【问题描述】:

我按如下方式计算点积:

import numpy as np
A = np.random.randn(80000, 3000)
B = np.random.randn(3000, 50)
C = np.dot(A, B)

运行此脚本大约需要 9 秒:

Mac@MacBook-Pro:~/python_dot_product$ time python dot.py 

real    0m9.042s
user    0m10.927s
sys     0m0.911s

我能做得更好吗? numpy 是否已经为核心使用了理想的平衡?

【问题讨论】:

  • 这应该是最快的方法。如果您希望对其他解决方案进行基准测试,请尝试使用 the @ operator
  • 使用np.__config__.show() 调查它使用什么库进行矩阵乘法。另一种方法是打开系统监视器并进行目视检查。
  • 除了将 BLAS 后端更改为 numpy,您可能不会比这更快。
  • 当我重新运行你的代码时,我需要 14 秒,而 13 秒只是创建 AB。因此,当您测试替代方案时,请记住仅跟踪函数操作的时间(在本例中为 np.dot)。这应该提供更相关的比较。
  • 我想我会在np.dot 上使用multiprocessingpool.map 来回答这个问题,但这花了我6 倍的时间。再看一些,下面链接中的第二个和第三个答案(但不是第一个/接受的答案)应该会有所帮助。 stackoverflow.com/questions/11442191/…

标签: python performance numpy multiprocessing


【解决方案1】:

this SO answer 的最后两个答案应该会有所帮助。

最后一个指向SciPy documentation,其中包括这句话:

"[np.dot(A,B) 使用 BLAS 进行评估,] 通常是 库经过仔细调整以在您的硬件上尽可能快地运行 利用高速缓存和汇编器实现。但 许多架构现在都有一个 BLAS,它也利用了 多核机器。如果您的 numpy/scipy 是使用其中之一编译的, 然后 dot() 将被并行计算(如果这更快),而不 你在做什么。”

所以听起来这取决于您的特定硬件和 SciPy 编译。有时np.dot(A,B) 会使用您的多个内核/处理器,有时可能不会。

要找出哪种情况是您的情况,我建议您在打开系统监视器的同时运行您的玩具示例(使用更大的矩阵),这样您就可以查看是只有一个 CPU 出现活动峰值,还是多个 CPU 出现峰值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 2021-02-11
    • 2018-04-14
    • 2022-01-13
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    相关资源
    最近更新 更多