joblib的性能与numpy ndarray的并行循环

时间:2012-07-25 13:34:08

标签: python numpy parallel-processing

我正在使用numpy在python中进行一些统计计算。到目前为止,我目前的实现并未并行化。所以我正在研究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( 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并行吗? 这是并行计算numpy ndarray元素的正确方法吗?

1 个答案:

答案 0 :(得分:0)

您可以在Parallel任务中同时包含两个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))

....
....

如果您在循环中调用Parallel任务,那么您的计算将不是最优的。

希望有帮助!

最诚挚的问候,