2017-05-13 14 views
1

コード1:はなぜコード2よりもコード1速いのですか?

n = int(input()) 
ls = [] 
for x in range(n): 
    ls += [(input())] 
ls.sort(key = int) 
for x in ls: 
    print (x) 

コード2: https://www.hackerrank.com/challenges/big-sorting

コード1はしない:

n = int(input()) 
ls = [] 
for x in range(n): 
    ls += [int(input())] 
ls.sort() 
for x in ls: 
    print (x) 

これらHackerRankの "ビッグ・ソート" 問題への私の解決策でしたコード2の実行中に時間制限超過エラーを出してください。

はなぜコード1より速く、コードの2以上ありますか?

+1

'+ ='の代わりに 'append'を使うと、より効率的なコードにすることができます。つまり、これは面白い質問のようです。 –

答えて

5

整数のリストを文字列に変換する必要があり、バージョン2は文字列のバージョンを保持し、ソートする整数に変換するだけで済むので、コードが遅くなります。背中の文字列に整数の変換

はあまりにも時間がかかります:

>>> import timeit 
>>> timeit.timeit("str(235739630407432043190819704398)", number=10**7) 
2.4063552810002875 

私は強く、テストの一部に含まれてソートする値は、両方の数々と非常に、非常に大きいと思われます。

Iは、インプレースのいずれかを拡張を使用していないと思います。代わりに、リストの内包表記を使用します。

個人的に
ls = [input() for x in range(n)] 

に、私はinput()通話ができるより速く読むことをsys.stdinにわたり反復使用すると思います。

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から読み取る最後の行は、あなたがすべての行に存在する改行を当てにすることはできません何の改行を持っていないし、それだけで簡単ですので、と:ここすべてのループは、最適化されたCコードに委任されていますストリップするのがより速い)。

intstr.stripを交換し、もう一度タイムアウトが発生します。

関連する問題