2017-05-13 70 views
1

代碼1:爲什麼Code 1比Code 2快?

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

代碼1不Code 2的時間超出錯誤。

爲什麼Code 1比Code 2更快?

+1

通過使用'append'而不是'+ ='可以使代碼變得更加高效。這就是說,這看起來像一個有趣的問題。 –

回答

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.stripint將再次導致暫停。

相關問題