为什么Code 1比Code 2更快?

时间:2017-05-13 13:28:08

标签: python performance

代码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更快?

1 个答案:

答案 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将再次导致超时。