【发布时间】:2013-10-16 07:56:31
【问题描述】:
我一直在尝试使用 numba 和 numexpr 来加快简单的逐元素矩阵乘法。我一直没能得到更好的结果,它们基本上(速度方面)都相当于 numpys 乘法函数。有没有人在这方面有运气?我是否使用了 numba 和 numexpr 错误(我对此很陌生),或者这完全是一种尝试加快速度的坏方法。这是一个可重现的代码,在此先感谢您:
import numpy as np
from numba import autojit
import numexpr as ne
a=np.random.rand(10,5000000)
# numpy
multiplication1 = np.multiply(a,a)
# numba
def multiplix(X,Y):
M = X.shape[0]
N = X.shape[1]
D = np.empty((M, N), dtype=np.float)
for i in range(M):
for j in range(N):
D[i,j] = X[i, j] * Y[i, j]
return D
mul = autojit(multiplix)
multiplication2 = mul(a,a)
# numexpr
def numexprmult(X,Y):
M = X.shape[0]
N = X.shape[1]
return ne.evaluate("X * Y")
multiplication3 = numexprmult(a,a)
【问题讨论】:
-
numexpr可以胜过numpy这样的类似 ufunc 的操作,尤其是将几个串在一起。此外,如果您有多个内核,请尝试设置ne.set_num_cores(N),其中N是您机器的内核数。 -
在我的机器上,基于
numexpr的函数比在单核上运行的np.multiply()慢约 15%,但是当我将内核数设置为8. 请记住,您可能会发现您必须重置 Python 进程的核心亲和性才能使用多个核心 - see my answer here。 -
如果可以,请将您的 numpy 更新到 1.8。 (在编写它时,即将发布),这应该会提供一个简单的加速。否则,您将不得不使用其他可以使用 SIMD 指令或可以优化您的处理器的东西。
标签: performance python-2.7 numpy matrix-multiplication numba