为测试机改进python代码的IO

为测试机改进python代码的IO,python,Python,我在做一些练习题。有一个问题叫做: 我的解决办法是: while 1: cnt = int(raw_input()) if cnt == 0: break vals = [int(u) for u in raw_input().split(' ')] valr = [] for i in range(cnt): valr.append(vals.index(i+1)+1) if vals == valr: print 'ambiguous'

我在做一些练习题。有一个问题叫做:

我的解决办法是:

while 1:
   cnt = int(raw_input())
   if cnt == 0:
      break
  vals = [int(u) for u in raw_input().split(' ')]
  valr = []
  for i in range(cnt):
    valr.append(vals.index(i+1)+1)
  if vals == valr:
    print 'ambiguous'
  else:
    print 'not ambiguous'  
当我签入时,它按预期工作。但当我在Codechef中提交解决方案时,它超时了

我的问题是。代码是否有任何错误(/可以改进),或者是否有任何特定的方法来处理测试机器的sysin和输出

[编辑] 接受的解决方案提供了一些很好的建议,我重新考虑了代码逻辑,并相应地修改了代码。代码现在可以在一定的时间内运行,尽管它会因错误的答案而失败(但无法在我的测试用例中复制错误的答案)。谢谢你的建议

import sys
def ambigcheck(lis):
   amb = 'ambiguous'
   for i in range(1,len(lis)+1):
       if lis[lis[i-1]-1] != i:
          amb = 'not ambiguous'
          break
   return amb 
while 1:
   cnt = int(sys.stdin.readline())
   if cnt == 0:
       break
   vals = [int(u) for u in sys.stdin.readline().split(' ')]
   sys.stdout.write(ambigcheck(vals))

不要使用
原始输入
。使用
sys.stdin
:作为迭代器,或
read()。并使用
sys.stdout.write
而不是
print
。尝试只使用一次:预先计算整个输出,然后将其写入屏幕

这将为您提供Python中最快的I/O

更多提示:

  • 您不需要构造新的排列,只需检查原始排列中的元素是否具有适当的索引即可
  • 您不需要进行完全检查,若至少有一个元素并没有正确的索引,则排列不会含糊不清
  • 避免使用
    .index()
    方法,按索引检查,而不是按值检查
  • 通过使用
    itertools.islice
    ,只读取奇数行,您可以更有效地处理输入(在Python中,您不需要很多项)

不要使用
原始输入。使用
sys.stdin
:作为迭代器,或
read()。并使用
sys.stdout.write
而不是
print
。尝试只使用一次:预先计算整个输出,然后将其写入屏幕

这将为您提供Python中最快的I/O

更多提示:

  • 您不需要构造新的排列,只需检查原始排列中的元素是否具有适当的索引即可
  • 您不需要进行完全检查,若至少有一个元素并没有正确的索引,则排列不会含糊不清
  • 避免使用
    .index()
    方法,按索引检查,而不是按值检查
  • 通过使用
    itertools.islice
    ,只读取奇数行,您可以更有效地处理输入(在Python中,您不需要很多项)

这可能属于CodeReview的一个建议:IO在计算上很昂贵,而
对于
循环来说也是如此。您应该尽可能多地使用
map()
和生成器表达式。看看是否可以将IO与代码主体分开。这可能属于CodeReview的一个建议:IO在计算上很昂贵,而
对于
循环来说也是如此。您应该尽可能多地使用
map()
和生成器表达式。看看是否可以将IO与代码主体分开。