Python 具有numpy-ndarray的joblib并行循环的性能

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

我正在用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( 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如果此问题不再有效,您应该将其标记为关闭。