我目前正在尝试从下面显示的过程中获得结果。但是,对于所需的步骤数来说,它花费的时间太长。我想加快结果。 如何针对这种情况实现多处理?
在我正在构建的类中,我有以下定义
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
使用多处理是否合理?
到目前为止,我已经检查了这些:
- 多处理嵌套 python 循环
- 傻瓜的 Python 多处理
但我无法实施这些,也无法获得解决方案。
正如我所想的,你在这里真正遇到的是一个动态编程风格的问题。您不断重新计算相同的项。例如,您只需要计算一次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
在这种方法中似乎没有变化(。如果您尝试使用某种 2 层 defaultdict 来记录您已经计算F
(或G
(的qi
和xi_pk
值,那么您将节省大量不必要的调用和F
(或G
(的计算。
(PS - 我知道这不是你要找的方法,但我认为它解决了你问题的核心。您花费大量时间重新计算已计算的项。