Python 具有numpy-ndarray的joblib并行循环的性能
我正在用python使用numpy进行一些统计计算。我当前的实现到目前为止还没有并行化。因此,我研究了python joblib Parallel,以实现简单的循环并行化 我的非并行部分代码如下所示:Python 具有numpy-ndarray的joblib并行循环的性能,python,numpy,parallel-processing,Python,Numpy,Parallel Processing,我正在用python使用numpy进行一些统计计算。我当前的实现到目前为止还没有并行化。因此,我研究了python joblib Parallel,以实现简单的循环并行化 我的非并行部分代码如下所示: def calcRADMatInt( i, j , RADMat, pdfMu, pdfSigma): if i==j: RADMat[i, j] = 0.0 else: RADMat[i, j] = calcRAD( pdfMu[i], np.squeeze( pdfSi
def calcRADMatInt( i, j , RADMat, pdfMu, pdfSigma):
if i==j:
RADMat[i, j] = 0.0
else:
RADMat[i, j] = calcRAD( pdfMu[i], np.squeeze( pdfSigma[i]), pdfMu[j], np.squeeze( pdfSigma[j]) )
RADMat[j, i] = RADMat[i,j]
def caldRADMat(....):
....
....
RADMat = np.zeros( (numLandmark, numLandmark) )
for i in range( 0, numLandmark):
for j in range( i, numLandmark)):
calcRADMatInt( i, j, RADMat, pdfMu, pdfSigma)
....
....
def caldRADMat(....):
....
....
RADMat = np.zeros( (numLandmark, numLandmark) )
for i in range( 0, numLandmark):
Parallel(n_jobs=8)(delayed(calcRADMatInt)( i, j, RADMat, pdfMu, pdfSigma) for j in range( i, numLandmark))
....
....
我试着将其并行化如下:
def calcRADMatInt( i, j , RADMat, pdfMu, pdfSigma):
if i==j:
RADMat[i, j] = 0.0
else:
RADMat[i, j] = calcRAD( pdfMu[i], np.squeeze( pdfSigma[i]), pdfMu[j], np.squeeze( pdfSigma[j]) )
RADMat[j, i] = RADMat[i,j]
def caldRADMat(....):
....
....
RADMat = np.zeros( (numLandmark, numLandmark) )
for i in range( 0, numLandmark):
for j in range( i, numLandmark)):
calcRADMatInt( i, j, RADMat, pdfMu, pdfSigma)
....
....
def caldRADMat(....):
....
....
RADMat = np.zeros( (numLandmark, numLandmark) )
for i in range( 0, numLandmark):
Parallel(n_jobs=8)(delayed(calcRADMatInt)( i, j, RADMat, pdfMu, pdfSigma) for j in range( i, numLandmark))
....
....
但是,生成的并行代码运行速度明显低于非并行版本
所以我想我的实际问题是:
我是否正确使用了joblib Parallel?
这是并行计算numpy ndarray元素的正确方法吗?您可以在并行任务中包括这两个for循环,如下所示:
def calcRADMatInt( i, j , RADMat, pdfMu, pdfSigma):
if i==j:
RADMat[i, j] = 0.0
else:
RADMat[i, j] = calcRAD( pdfMu[i], np.squeeze( pdfSigma[i]), pdfMu[j], np.squeeze( pdfSigma[j]) )
RADMat[j, i] = RADMat[i,j]
def caldRADMat(....):
....
....
RADMat = np.zeros( (numLandmark, numLandmark) )
Parallel(n_jobs=-1)(delayed(calcRADMatInt)
(i, j, RADMat, pdfMu, pdfSigma)
for i in range(0,numLandmark)
for j in range( i, numLandmark))
....
....
如果您在循环中调用并行任务,那么您的计算是次优的
希望有帮助
致以最诚挚的问候,Numpy比循环快。也许你可以修改
calcRAD
方法来直接在numpy数组上工作。我对joblib
知之甚少,但如果RADMat
不是并行循环末尾的零数组(不仅速度较慢,而且可能也不正确),我会感到惊讶。是的,确实存在一个bug。它是在重写并行化过程中提交的。谢谢你的提示。我想我应该使用numpy数组,而不是嵌套for循环。谢谢您的评论@eumiro@tisch如果此问题不再有效,您应该将其标记为关闭。