这是一个困扰我一段时间的简单问题。
我试图将我的代码重写为并行,并且在此过程中我需要分割要在多个节点上完成的总和,然后将这些小数量加在一起。我正在与之合作的是:
def pia(n, i):
k = 0
lsum = 0
while k < n:
p = (n-k)
ld = (8.0*k+i)
ln = pow(16.0, p, ld)
lsum += (ln/ld)
k += 1
return lsum
其中n
是限制,i
是整数。有没有人提供一些关于如何拆分并最终获得相同结果的提示?
编辑:对于那些提问,我不是使用pow()
而是使用自定义版本来有效地使用浮点数:
def ssp(b, n, m):
ssp = 1
while n>0:
if n % 2 == 1:
ssp = (b*ssp) % m
b = (b**2) % m
n = n // 2
return ssp
答案 0 :(得分:1)
由于从一个传递到下一个传递使用的唯一变量是k
,而k
每次只增加一个,所以很容易将计算分开。
如果您还将k
传递给pia
,那么您将拥有可定义的起点和终点,并且您可以根据需要将其拆分为多个部分,最后,将所有结果一起添加。如下所示:
# instead of pia(20000, i), use pia(n, i, k) and run
result = pia(20000, i, 10000) + pia(10000, i, 0)
此外,由于n
用于设置限制和直接计算,因此需要拆分这两个用途。
from math import pow
def pia(nlimit, ncalc, i, k):
lsum = 0
while k < nlimit:
p = ncalc-k
ld = 8.0*k+i
ln = ssp(16., p, ld)
lsum += ln/ld
k += 1
return lsum
if __name__=="__main__":
i, ncalc = 5, 10
print pia(10, ncalc, i, 0)
print pia(5, ncalc, i, 0) + pia(10, ncalc, i, 5)
答案 1 :(得分:-1)
看起来我找到了办法。我所做的是在每个节点计算一个部分的总和中(例如,节点1计算k = 1,节点2 k = 2,节点3 k = 3,节点4 k = 4,节点1 k = 5 ...然后将它们收集起来并添加它们。