在Python 2.7中有效循环

时间:2015-06-16 06:02:07

标签: python performance python-2.7 for-loop

我正在研究蚊帐对蚊子种群的影响以及它如何影响疟疾的传播。 EIR告诉我们一个人一年内感染的叮咬数量。为了计算这个,我必须在python中使用recursisve函数S(t)求和。该系列在大约50次迭代后收敛但是如果我将总和限制增加到20以上则需要很长时间(大约一个小时)。我可能做错了,我将非常感谢你的帮助。用python编写的代码如下所示。

{
  "name": "John",
  "age": 23,
  "address": "Lorem ipsum"
  ...
  ...
}

1 个答案:

答案 0 :(得分:4)

def S(x):
    if x<=n:    
        return 0
    elif x==n+1:    
        return 0.05
    else:
        return S(x-1) + ((kappa*Q_0*(1-S(x-1)))/f_chiLLIN)
#              ^^^^^^                  ^^^^^^

S(x)中,您进行2次递归调用以计算S(x-1),这会对计算S(x-2)进行4次递归调用,这会对计算S(x-3)进行8次递归调用,并且等等,直到你遇到递归的基本情况。你不需要重新计算这些东西;只需计算一次S(x-1)并使用该值两次:

def S(x):
    if x<=n:    
        return 0
    elif x==n+1:    
        return 0.05
    else:
        s_lower = S(x-1)
        return s_lower + ((kappa*Q_0*(1-s_lower))/f_chiLLIN)

但是,这仍然会进行比必要更多的重新计算,因为每次拨打S时都会:

for x in xrange(1,totalx+1):
    B = B + ((p_chiLLIN)**x)/f_chiLLIN*S(x)

它必须再次将S的所有值重新计算到基本情况。请考虑进一步的更改,例如memoizing S