【发布时间】:2021-07-17 16:07:15
【问题描述】:
我有一个程序,其主要性能瓶颈涉及将一个维度为 1 的矩阵和另一个大维度的矩阵相乘,例如1000:
large_dimension = 1000
a = np.random.random((1,))
b = np.random.random((1, large_dimension))
c = np.matmul(a, b)
换句话说,将矩阵 b 与标量 a[0] 相乘。
我正在寻找最有效的计算方法,因为这个操作重复了数百万次。
我测试了这两种简单方法的性能,它们实际上是等效的:
%timeit np.matmul(a, b)
>> 1.55 µs ± 45.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit a[0] * b
>> 1.77 µs ± 34.6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
有没有更有效的计算方法?
- 注意:我无法将这些计算转移到 GPU,因为程序正在使用多处理并且许多此类计算是并行完成的。
【问题讨论】:
-
你能把你的 a 值打包到对角矩阵 A 中,将你的 b 值打包到二维矩阵 B 中,然后只做 AB 吗?如果您希望这更快,我认为您将不得不返工使您达到这一点的任何东西
-
a*b时间有什么不同吗? -
尝试第三次测试,使用
d=np.random.random(),%timeit d*b我发现这比%timeit a[0] * b快 33% -
numpy一直提供*元素明智的乘法,它使用broadcasting有效地处理混合维度。添加@以提供批处理dot,即sum-of-products。在可能的情况下,它将任务传递给快速 BLAS(或相关)代码。它在这里工作是因为summed维度的大小为 1。相对速度可能会因您的numpy环境而异 - 您安装了哪些 BLAS 或相关库。
标签: python performance numpy matrix-multiplication scalar