我在创建一个在根寻找算法中使用的有效函数时遇到了问题。我需要创建一个对标签进行三次求和的函数,它包含一对列表的三次求和。我已经尝试了几种实现,例如使用嵌套列表,字典,在两个双重求和(带有中间列表)中拆分内部三重求和,保持'm'和amp; 'n'词典/列表分开,使用itertools.izip()一起审阅R和E,可能还有其他几个我忘了。
我的想法是,我需要能够区分其他功能的标签,因此我需要一种有效的方式来存储,访问和汇总这些数字。
现在,这个函数是迭代的一部分,所以第一次,这些列表中的大多数都是空的。然后我需要为电子词典中的每个值使用一个rootfinding算法(非常简单)。使用根查找算法(取决于此功能)后,将使用其解决方案重新填充列表。这意味着在第二次迭代中,每个列表将包含大约1000个数字的顺序。之后,rootfinding再次与这个新函数一起使用,在每个列表中给出(重新绑定后)1000个新数字。
显然,如果在第一次迭代中这个rootfinding已经需要几分钟,我就会遇到问题。我有一个特定的实现第一次迭代(由于列表中的所有空/只有一个值,在标签上减少了3个循环),它在两秒内找到所有这些根。
如何有效地进行此求和,同时仍能区分各种列表?
提前致谢
注意:这段代码不是我最美丽的尝试,但它是我想要完成的最明确的。
E = {}
R = {}
for i in labels:
E[i] = {'m':[i], 'n':[]} #the label happens to be the value that's in here
E[-i] = {'m':[], 'n':[-i]}
R[i] = {'m':[1], 'n':[]}
R[-i] = {'m':[], 'n':[1]}
def function(A, En):
temp = 0
for a in E:
if (not(ACTIVATE) or a != A):
for b in E:
for c in E:
if ( not(ACTIVATE) or b != c):
for i in xrange(len(R[a]['n'])):
for j in xrange(len(R[b]['m'])):
for k in xrange(len(R[c]['m'])):
temp += R[a]['n'][i]*R[b]['m'][j]*R[c]['m'][k]/(En - (-E[a]['n'][i] + E[b]['m'][j] + E[c]['m'][k]))
for i in xrange(len(R[a]['m'])):
for j in xrange(len(R[b]['n'])):
for k in xrange(len(R[c]['n'])):
temp += R[a]['m'][i]*R[b]['n'][j]*R[c]['n'][k]/(En + (E[a]['m'][i] - E[b]['n'][j] - E[c]['n'][k]))
return .5*temp