Реализация вложенных циклов в pyspark - PullRequest
0 голосов
/ 21 мая 2019

Я новичок в PySpark, и я пытаюсь понять, как мы можем написать несколько вложенных циклов for в PySpark, я перебираю некоторые из существующих вопросов, но не решил мою проблему.Мы будем благодарны за любую помощь.

FB - это СДР pyspark, содержащий 200 столбцов и 06 строк, а delay - это список значений, рассчитанных на предыдущем шаге.Если потребуется, я предоставлю.

  s2=[ ['0' for col in range(100)]  for row in range(100)]
  for u in log_progress (range(100)):
      for v in log_progress (range(100)):
          energy=0.0
          for h in log_progress(range(200)):
              z=0.0
              for l in log_progress(range(6)):
                  if h+delay[l][u][v] < 100:
                     m= int(h+delay[l][u][v])
                     z= z + float(str(FB.collect()[l][m]))
                 energy= energy+z*z
    s2[u][v]=round(energy)

При отладке кода значение энергии вычисляется правильно, однако для записи значений в s2 требуется много времени.Мой вопрос, есть ли альтернатива, чтобы сделать это.

1 Ответ

0 голосов
/ 21 мая 2019

Содержимое ваших вложенных циклов for будет называться в сумме: 100*100*200*6 = 12,000,000 раз, вы можете сделать каждый расчет более эффективным или выполнять эти вычисления меньшее количество раз. У меня есть идея сократить количество вычислений, которые вы должны сделать.

Как вы настроили этот расчет, я думаю, вы можете более эффективно справиться с вашей переменной h. Вместо зацикливания всех 200 опций с диапазоном вы можете построить только значения h, которые удовлетворяют вашему условию if h+delay[l][u][v]< 100:, и зная, что delay[l][u][v] уже есть (перебрав l,u,v до h), мы можем определить конкретный диапазон h значений, которые мы хотим зациклить с for h in log_progress(range(0,int(100-delay[l][u][v]))).

Похоже, что во многих случаях у вас будет только несколько значений h, которые влияют на ваше решение, а остальные опускаются через if h+delay[l][u][v]< 100:, поэтому пропуск этих опций с самого начала может ускорить ваш код. Ниже следует сделать, как я описал:

  s2=[ ['0' for col in range(100)]  for row in range(100)]
  for u in log_progress (range(100)):
      for v in log_progress (range(100)):
          energy=0.0
          #for h in log_progress(range(200)):
          z=0.0
          for l in log_progress(range(6)):
              for h in log_progress(range(0,int(100-delay[l][u][v]))):
              #if h+delay[l][u][v]< 100:
                 m= int(h+delay[l][u][v])
                 z= z + float(str(FB.collect()[l][m]))
              energy= energy+z*z
    s2[u][v]=round(energy)

Это должно привести вас к 200-кратному ускорению и абсолютно без ускорения, в зависимости от того, как выглядят ваши delay[l][u][v] данные.

...