为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

拉莫斯之舞 2022-11-01 17:19:00
我有一个 500×40K 的矩阵A和一个 40K 元素的向量q,形式为 numpy 数组。据估计,计算它们的点积需要 16 分钟A.dot(q)。因为q我需要用 50K 来做这个计算(很多),我想尽可能地减少计算时间。计算Aand的点积q或更好的方法是A更有效的更好的方法Q吗?Scipy似乎为此提供了一个解决方案,但我不太明白我应该如何在这里解决我的问题。有人可以帮我吗?from time import process_timet1 = process_time()A[0,:].dot(q)t2 = process_time()print("Estimated Total Time:", (t2-t1)*A.shape[0]/60)
查看完整描述

2 回答

?
富国沪深

TA贡献1790条经验 获得超9个赞

这是您可以执行的操作的示例:

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

在输出中,( ) 列i是和的乘积。即使对于您所需的数组大小,这也应该相当快。它甚至不应该像你提到的那样花很长时间,可能在一分钟左右的时间内。BB[:,i]Aq_i


查看完整回答
反对 回复 2022-11-01
?
动漫人物

TA贡献1815条经验 获得超10个赞

如果您有足够A的内存来保存所有q向量,那么如果您将所有q向量放入一个数组Q并调用A.dot(Q).


这是在配备 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 分钟相差甚远!


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


查看完整回答
反对 回复 2022-11-01
  • 2 回答
  • 0 关注
  • 103 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信