многопроцессорность, вложенная для - PullRequest
0 голосов
/ 31 января 2020

Я сейчас пытаюсь получить результат из процесса, показанного ниже. Тем не менее, это занимает слишком много времени для количества необходимых шагов. Я хотел бы ускорить результат. Как я могу реализовать многопроцессорность для этой ситуации?

В классе, который я строю, у меня есть следующее определение

    def class_corr(self,Delta,xi_q,Q,counter):
        to = self.t
        npts = 512
        x0 = 12
        dx =2*x0/npts
        norm=0
        classic=0
        for n in range(0,npts+1):
            qi = -x0+n*dx
            for m in range(0,npts+1):
                pj = -x0+m*dx
                for k in range(0,npts+1):
                    xi_pk = -x0+k*dx
                    f1    += dx**3*wt(qi,pj,qo,po,to)*F(qi,xi_pk,Delta, Q)
                    fn += dx**3*wt(qi,pj,qo,po,to)*G(qi,xi_pk,xi_q,Delta,Q)
        if counter:
            return  [f1, fn/f1]
        return  fn/f1

Разумно ли даже использовать многопроцессорность?

До сих пор я проверял следующее:

  1. Мультипроцессорная вложенность python циклов
  2. Python мультипроцессинг для чайников

но я не смог ни реализовать их, ни найти решение.

1 Ответ

2 голосов
/ 31 января 2020

Если подумать, то, что у вас действительно есть, это проблема стиля динамического c программирования. Вы продолжаете пересчитывать одни и те же условия. Например, вам нужно рассчитать dx^3 только один раз, но вы делаете это npts^3 раз. Точно так же вам нужно вычислять каждый 3*wt(qi,pj,qo,po,to) термин только один раз, но вы делаете это 2*npts раз.

Попробуйте что-то вроде:

def class_corr(self,Delta,xi_q,Q,counter):
    to = self.t
    npts = 512
    x0 = 12
    dx =2*x0/npts
    dx3 = dx**3
    norm=0
    classic=0
    for n in range(0,npts+1):
        qi = -x0+n*dx
        for m in range(0,npts+1):
            pj = -x0+m*dx
            wt_curr = wt(qi,pj,qo,po,to)
            for k in range(0,npts+1):
                xi_pk = -x0+k*dx
                f1 += dx3*wt_curr*F(qi,xi_pk,Delta, Q)
                fn += dx3*wt_curr*G(qi,xi_pk,xi_q,Delta,Q)
    if counter:
        return  [f1, fn/f1]
    return  fn/f1

Кроме того, вы рассчитываете F & G npts больше раз, чем нужно. Похоже, что каждый меняется только с qi и xi_pk (xi_q, Delta и Q, похоже, не отличаются в этом методе). Если вы попытаетесь использовать своего рода двухслойный defaultdict для записи значений qi и xi_pk, для которых вы уже рассчитали F (или G), вы затем сохраните множество ненужных вызовов и вычислений F (или G).

(PS - я знаю, что это не тот подход, который вы ищете, но я думаю, что он решает суть вашей проблемы. Вы тратите много времени на пересчет уже рассчитанных терминов. )

...