Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么一个代码比另一个更快,即使迭代次数更多?_Python_Iteration_Permutation_Ambiguous - Fatal编程技术网

Python 为什么一个代码比另一个更快,即使迭代次数更多?

Python 为什么一个代码比另一个更快,即使迭代次数更多?,python,iteration,permutation,ambiguous,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

我的代码很短,迭代次数比其他代码少,但当其他代码在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")    
比此代码更快:

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")    

请帮帮我…

我想你的第二个代码不在函数中


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

看起来您正在使用字符串,而其他代码正在使用int,这会使您的速度有所降低。

当出现这种一致的时差时,我们并不是在讨论速度慢2倍或3倍的问题-如果一个方法通过,另一个总是超时,这是一个巨大的时间差——通常与算法复杂度有关


虽然第一个代码有很大的改进空间(例如,使用xrange而不是range),但在最终的数组中,结果是通过随机访问进行更新,直接通过
data[i]-1
计算的索引进行更新,而在第二个代码段中,您使用
caseList.index(str(i))
检索每个索引。“索引”lisr方法从列表的开头开始对列表执行线性搜索。它可能看起来很小,但当列表中的每个元素都不存在时,你的算法是O(N)变成了O(N²)-这在第二种形式中消除了戏剧性的速度下降。

起初我并不完全相信这一点,但经过快速测试后,我要说的是哇。我的快速测试表明,本地人(对我来说)比gloabls快170%。但这不会导致超时-问题在于使用“索引”方法链接到问题: