Python 为什么一个代码比另一个更快,即使迭代次数更多?
我的代码很短,迭代次数比其他代码少,但当其他代码在codechef.com上被接受时,它仍然会收到一个超过时间限制的错误。这些代码是codechef.com上“模糊排列”问题的解决方案 为什么这个代码是: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
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%。但这不会导致超时-问题在于使用“索引”方法链接到问题: