numpy / pandas矩阵乘法的多线程?

时间:2014-04-04 01:11:14

标签: python multithreading numpy matrix pandas

我真的想知道如何在numpy / pandas上使用多核处理进行矩阵乘法。

我正在尝试的是:

M = pd.DataFrame(...) # super high dimensional square matrix.
A = M.T.dot(M) 

由于产品总数很多,这需要大量的处理时间,而且我认为使用多线程进行巨大的矩阵乘法是很简单的。所以,我在谷歌搜索,但我找不到如何在numpy / pandas上做到这一点。我是否需要使用一些python内置线程库手动编写多线程代码?

2 个答案:

答案 0 :(得分:3)

在NumPy中,多线程矩阵乘法可以通过基本线性代数子程序BLAS的多线程实现来实现。你需要:

  1. 有这样的BLAS实施; OpenBLAS,ATLAS和MKL都包含多线程矩阵乘法。
  2. 编译NumPy以使用此类实现。
  3. 确保您重叠的矩阵都有dtype float32float64(并且符合某些对齐限制;我建议使用NumPy 1.7.1或更高版本这些已经放松了。)
  4. 一些警告适用:

    • 使用GCC编译时,较旧版本的OpenBLAS在使用multiprocessing的程序中遇到麻烦,其中包括使用joblib的大多数应用程序。特别是,他们会挂起。原因是GCC中存在错误(或缺少功能)。已提交patch但尚未包含在主要来源中。
    • 您在典型Linux发行版中找到的ATLAS包可能会也可能不会被编译为使用多线程。

    至于熊猫:我不确定它是如何做点产品的。转换为NumPy数组并返回以确定。

答案 1 :(得分:1)

首先,我还建议转换为颠簸阵列并使用numpys点功能。如果您有权访问目前或多或少是最快实现的MKL构建,则应尝试设置环境变量OMP_NUM_THREADS。这应该激活系统的其他核心。在我的MAC上它似乎正常工作。另外,我会尝试使用似乎比np.einsum

更快的np.dot

但请注意!如果你已经编译了一个使用OpenMP进行并行化的多线程库(比如MKL),你必须考虑,所有苹果系统上的“默认gcc”不是gcc,它是Clang / LLVM而且Clang无法用目前OpenMP支持,除了你使用仍在实验的OpenMP主干。因此,您必须安装intel编译器或任何其他支持OpenMP

的编译器