代码1:
n = int(input())
ls = []
for x in range(n):
ls += [(input())]
ls.sort(key = int)
for x in ls:
print (x)
代码2:
n = int(input())
ls = []
for x in range(n):
ls += [int(input())]
ls.sort()
for x in ls:
print (x)
这些是我对HackerRank“大排序”问题的解决方案: https://www.hackerrank.com/challenges/big-sorting
代码2在代码2执行时没有超出时间限制错误。
为什么Code 1比Code 2更快?
答案 0 :(得分:5)
代码较慢,因为您现在需要将整数列表转换回字符串,而版本2保留字符串版本,只转换为整数进行排序。
将整数转换回字符串也需要时间:
>>> import timeit
>>> timeit.timeit("str(235739630407432043190819704398)", number=10**7)
2.4063552810002875
我强烈怀疑某些测试中包含的排序值很多,非常非常大。
我也不会使用就地扩展。改为使用列表理解:
ls = [input() for x in range(n)]
就个人而言,我会使用sys.stdin
上的迭代来比input()
次呼叫更快地读取;这里所有循环被委托给优化的C代码:
import sys
from itertools import islice
n = int(next(sys.stdin))
nums = sorted(map(str.strip, islice(sys.stdin, n)), key=int)
print(*nums, sep='\n')
(因为从stdin
读取的最后一行没有换行符,你不能指望所有行上都有换行符,然后它就更容易和更快地去除了。)
用str.strip
替换int
将再次导致超时。