嵌套的多处理

时间:2020-01-31 18:39:54

标签: python loops parallel-processing multiprocessing

我目前正在尝试从下面显示的过程中获得结果。但是,所需步骤数花费的时间太长。我想加快结果。 在这种情况下如何实现多处理?

在我正在建立的课程中,我具有以下定义

    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. Multiprocessing nested python loops
  2. Python multiprocessing for dummies

但是我无法实现这些功能,也没有找到解决方案。

1 个答案:

答案 0 :(得分:2)

考虑到这一点,您真正遇到的是一个动态的编程风格问题。您继续重新计算相同的条款。例如,您只需要计算一次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

此外,您计算FG npts的次数比所需次数多。看起来每个变量仅随qixi_pk而变化(xi_qDeltaQ在这种方法中似乎没有变化)。如果您尝试使用某种2层defaultdict来记录您已经计算出qi(或xi_pk)的FG值,则可以节省了大量不必要的调用和F(或G)的计算。

(PS-我知道这不是您要寻找的方法,但我认为它可以解决您的问题的核心。您花费大量时间重新计算已经计算出的术语。)