如何在Python中更快地找到大矩阵的点积(但结果大小适中)?

如何在Python中更快地找到大矩阵的点积(但结果大小适中)?,python,numpy,scipy,linear-algebra,matrix-multiplication,Python,Numpy,Scipy,Linear Algebra,Matrix Multiplication,我有一个500×40K矩阵a和一个40K元素向量q,以numpy数组的形式。据估计,通过A.dot(q)计算它们的点积需要16分钟。因为我需要用50Kq来做这个计算(这是很多),所以我希望尽可能减少计算时间 计算A和q的点积,或者计算A和q=[q1,…,qn]的点积是否更有效Scipy似乎在中提供了一个解决方案,但我不太明白应该如何处理我的问题。有人能帮我吗 from time import process_time t1 = process_time() A[0,:].dot(q) t2 =

我有一个500×40K矩阵
a
和一个40K元素向量
q
,以numpy数组的形式。据估计,通过
A.dot(q)
计算它们的点积需要16分钟。因为我需要用50K
q
来做这个计算(这是很多),所以我希望尽可能减少计算时间

计算
A
q
的点积,或者计算
A
q
=[q1,…,qn]的点积是否更有效Scipy似乎在中提供了一个解决方案,但我不太明白应该如何处理我的问题。有人能帮我吗

from time import process_time
t1 = process_time()
A[0,:].dot(q)
t2 = process_time()
print("Estimated Total Time:", (t2-t1)*A.shape[0]/60)

以下是您可以做的示例:

Q = np.hstack((q1, q2, q3, q4, ...))
B = np.dot(A, Q)

在输出中,
B
B[:,i]
)的
i列是
A
q\u i
的乘积。这应该是相当快的,即使对于所需的数组大小也是如此。如果你有足够的内存来存放
a
和所有
q
向量,如果你把所有
q
向量放入一个数组
q
并调用
a.dot(q)
,那么计算这些乘积应该不需要16分钟

这是一款配备2.6 GHz Intel Core i7和16 GB内存的笔记本电脑。我正在使用交互式Python shell
ipython

In [1]: import numpy as np

In [2]: rng = np.random.default_rng()

In [3]: A = rng.normal(size=(500, 40_000)).astype(np.float32)

In [4]: Q = np.ones((40_000, 50_000), dtype=np.float32)

In [5]: %timeit A.dot(Q)
7.79 s ± 235 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
这还不到8秒,远远超过16分钟

如果您没有足够的内存,则可能需要更长的时间,因为操作系统可能会开始将内存交换到磁盘。

a.dot(b)
通常与您得到的一样好。有时数组足够大,分块执行可以节省时间。对于完整阵列,内存管理可以节省任何时间。“我有一个500×40K的矩阵a和一个40K的元素向量q,以numpy数组的形式。据估计,用a.dot(q)计算它们的点积需要16分钟。”这是你的第一句话,你说
q
是一个40K元素向量。在这种情况下,
A.dot(q)
不应花费16分钟。在我6岁的笔记本电脑上,需要4.9毫秒。“因为有5万个q…”啊,那就是16分钟。对前几个句子进行一点临摹编辑可能会避免读者最初的一些困惑。