【问题标题】:Fastest way to compute matrix multiplication计算矩阵乘法的最快方法
【发布时间】:2017-05-09 18:44:14
【问题描述】:

我计算矩阵乘法如下:

    import numpy as np
    A=np.random.randn(1,3000,30000)
    B=np.random.randn(50,1,30000)
    C=A*B

C 的计算大约需要 10 分钟。我该如何改进?

    In [4]: timeit A*B
    1 loops, best of 3: 1min 59s per loop

更新

【问题讨论】:

  • 为什么要改进这个?它看起来已经优化了。
  • 那是 2 分钟,而不是 10 分钟。
  • @Andy 可能是因为timeit 多次运行代码
  • 你有足够的内存来完成计算吗?结果是 (50 * 3000 * 30000 * 64 位) 36 GB 大小,在我的机器上它的交换使它爬行停止
  • 避免交换的最安全方法是使用(购买)更多 RAM 或使用更小的dtype

标签: python performance numpy multiprocessing


【解决方案1】:

看来您的主要瓶颈是 RAM 大小。您的计算结果是 36 GB 大小,使您的操作系统将数据写入交换。您可以尝试使用 dask 进行核心计算并将结果直接流式传输到 HDF5 文件:

import dask
import dask.array

A = dask.array.random.random((1, 3000, 300000), chunks=1024)
B = dask.array.random.random((50, 1, 300000), chunks=1024)

C = A * B

dask.array.to_hdf5('myfile.hdf5', '/C', C)

确保安装

pip install dask[array]
pip instal h5py

这可能不会加速您的计算,因为您仍然受 I/O 限制(仍然写入硬盘),但至少它会使计算易于管理并保持您的计算机响应。

如果您不需要所有 C 用于将来的计算,另一种解决方案是手动分割操作:

for i in B.shape[0]:
    C = A * B[i, ...]  # do not save this result but rather use and discard it immediately

【讨论】:

  • 我正在运行代码并且不得不停止它,因为硬盘存储空间不足。文件“myfile.hdf5”的大小已达到 125GB。这是什么原因?
猜你喜欢
  • 2021-02-11
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
  • 2016-02-06
  • 2018-04-14
  • 2012-08-25
  • 1970-01-01
相关资源
最近更新 更多