为什么一个代码比其他代码更快,即使迭代更多?

时间:2012-03-01 20:29:47

标签: python iteration permutation ambiguous

我的代码很短,迭代次数少于另一次,但仍然会在codechef.com上接受其他代码时超出时间限制错误。这些代码是codechef.com上“模糊排列”问题的解决方案 为什么这段代码:

def inverse(data,x):

    temp=[]

    for i in range(x):
        temp.append(0)
    for i in range(x):
        temp[data[i]-1]=i+1
    return temp

def main():

    while 1:
        x=input()
        if not x:
            return
        data=raw_input().split(' ')
        for i in range(len(data)):
            data[i]=int(data[i])
        temp = inverse(data,x)
        if temp==data:
            print 'ambiguous'
        else:
            print 'not ambiguous'

if __name__ == "__main__":
    main()

比这段代码更快:

while True:

    output=[]
    n= input()
    if n==0: break
    caseList= raw_input().split()
    amb=1
    for i in range(1, n+1):
        output.append(str(caseList.index(str(i))+1))

    if output==caseList:
        print ("ambiguous")
    else:
        print ("not ambiguous")    

请帮帮我......

3 个答案:

答案 0 :(得分:3)

我认为你的第二个代码不在函数内部。

访问函数中的局部变量要比访问全局变量快得多。这意味着在全局范围内运行的代码总是可能会更慢。

答案 1 :(得分:2)

当出现这样一致的时间差时,我们不会谈论速度慢2或3倍的东西 - 如果一种方法通过,而另一种方法总是超时,那么这是一个巨大的时间差 - 通常与算法有关复杂性。

虽然第一个代码有足够的空间来改善(例如,使用xrange而不是范围),但在最终数组中,结果是通过随机访问更新,直接由data[i] - 1计算的索引进行更新 - 在第二个代码段中,使用caseList.index(str(i))检索每个索引。 “index”lisr方法从列表开始执行线性搜索。它可能看起来很少,但是当它对列表中的每个元素进行处理时,你的O(N)算法变为O(N²) - 它以第二种形式表现出明显的速度。

答案 2 :(得分:1)

看起来你正在使用其他代码正在使用整数的字符串,这会减慢你的速度。