优化竞争的Python代码

时间:2018-03-13 18:28:03

标签: python python-3.x performance

我是Python的新手,我试图通过解决CodeChef上的问题来熟悉它。我试图解决Easy问题Number Game。问题是我的代码的执行时间太长了。

我已经将我编写的Python解决方案翻译成了C ++,并且提交被接受了,所以我知道我有一个正确的答案,它只是一个不变的倍数。

是否有可能在规定的时间内在Python 3中解决此问题?你能帮助我加快我的代码来实现这个目标吗?

import time

def getStartValues(A, M):
    startVals = [0]*M
    b = [0]*len(A)
    for i in range(len(A)-1):
        b[i+1] = (10*b[i] + A[i]) % M
    f = 0
    power = 1
    for i in range(len(A)-1,0,-1):
        startVals[(b[i]*power + f) % M] += 1
        f = (A[i]*power + f) % M
        power = (power*10 % M)
    startVals[f] += 1
    return startVals, power

def checkValues(i, startVals, M, powNm1, checked, chklst):
    if checked[i] == 1:
        return startVals[i]
    q = [i]
    chk = [0]*M
    chk[i] = 1
    while len(q) > 0:
        val = q.pop(0)
        for j in chklst:
            val2 = (powNm1*val + j) % M
            if checked[val2] > 0:
                checked[i] = 1
                return startVals[i]
            elif chk[val2] == 0:
                q.append(val2)
                chk[val2] = 1
    return 0

def compute(A, M):
    startVals, power = getStartValues(A, M)

    checked = [0]*M
    checked[0] = 1
    chklst = [j for j in range(M) if startVals[j] > 0]
    total = 0
    for i in chklst:
        c = checkValues(i, startVals, M, power, checked, chklst)
        total += c

    return total

start = time.time()
file = open('numbgame.in', 'r')
#T = int(input())
T = int(file.readline())
for i in range(T):
    #A, M = input().split()
    A, M = file.readline().split()
    A = list(map(int,A))
    M = int(M)
    print(compute(A, M))
tDiff = time.time() - start
print('Total time: %s' % tDiff)

请注意,为方便起见,我已修改代码以从文件中读取并显示执行时间,并且在提交之前需要进行一些小的更改。

getStartValues接收输入A和(小)整数M的(大)数字列表,并返回模数M,可以通过删除单个数字从A生成。

checkValues采用索引i,列表startValues,整数M,整数powNm1(值10 ^(n-1)mod M,其中n是A中的数字位数,检查的列表保持不变跟踪一个值是否已被确定为可解决的,以及列表chklst(包含索引i,使得startValues [i]> 0)。

大部分时间都花在函数getStartValues上,因为A最长可达10 ^ 6位。在我的桌面上,getStartValues函数调用大约需要1.2秒,而计算函数的其余部分需要大约0.04秒(对于最坏的情况输入)。

0 个答案:

没有答案