如何提高所描述的python程序的时间复杂度

时间:2017-05-14 10:30:27

标签: performance python-3.x optimization

我想优化此代码,但我不知道如何进一步优化。 以下是输入的示例:

3 #size of array  
3 4 3 #data in array  
6 # number of commands  
C 1 2  
C 1 3  
C 3 3  
U 1 4  
C 1 3  
C 1 2  

' C'和' U'请参阅以下操作:

C X Y : Compute the value of F( A[X] ) + F( A[X + 1] ) + F( A[X + 2] ) + .... + F( A[Y] ) (mod 10^9 + 7)
U X Y: Update the element of array A[X] = Y

这是我的代码:

from fractions import gcd
local_gcd=gcd
def F(x):
    global local_gcd
    sum1=0
    for i in range(1,x+1):
         sum1+=local_gcd(i,x)
    return sum1   
size_of_list=int(input())
ele=input()
eles=ele.split(" ")
A=[]
for i in eles:
    A.append(int(i))

num_of_commands=int(input())
mod_val=1000000007
for i in range(0,num_of_commands):
    com=input()
    com_list=com.split(" ")
    x=int(com_list[1])
    y=int(com_list[2])
    sum1=0
    if com_list[0]=='C':
        for i in range(x,y+1):
            sum1+=F(A[i-1])
        print(sum1%mod_val)
    elif com_list[0]=='U':
        A[x-1]=y

1 个答案:

答案 0 :(得分:0)

您可以使用Memoization加快速度。也就是说,一旦你弄清楚F(i)是什么,你就再也不需要计算它了。

在您的示例中,您将进行的F()调用是:

F(3), F(4)
F(3), F(4), F(3)
F(3)
F(4), F(4), F(3)
F(4), F(4)

通过“记忆”F(),您只需要计算两个值:F(3)和F(4)。

如果您使用的是Python 3.2或更高版本,请尝试使用内置的functools.lru_cache装饰器自动执行此操作:https://stackoverflow.com/a/14731729/4323