7

私が実行したコードは次のとおりです。

import timeit

print timeit.Timer('''a = sorted(x)''', '''x = [(2, 'bla'), (4, 'boo'), (3, 4), (1, 2) , (0, 1), (4, 3), (2, 1) , (0, 0)]''').timeit(number = 1000)
print timeit.Timer('''a=x[:];a.sort()''', '''x = [(2, 'bla'), (4, 'boo'), (3, 4), (1, 2) , (0, 1), (4, 3), (2, 1) , (0, 0)]''').timeit(number = 1000)

結果は次のとおりです。

0.00259663215837
0.00207390190177

どちらもリストをコピーしているにもかかわらず、 .sort() を使用すると sorted() よりも一貫して高速である理由を知りたいですか?

注: Win7 を搭載した 2.53Ghz i5 で Python 2.7 を実行しています。

4

2 に答える 2

8

あなたが見ている違いはごくわずかであり、長いリストでは完全になくなります。* 1000の定義に追加するだけxで、私のマシンで次の結果が得られます。

2.74775004387
2.7489669323

sorted()あなたにとって少し遅かった理由についての私の最善の推測は、反復可能なものをリストにコピーできるsorted()汎用コードを使用する必要があるということですが、リストを直接コピーすると、ソースもリストであると仮定できます。CPython で使用される並べ替えコードは、実際には と で同じであるため、それが違いの原因ではありません。list.sort()sorted()

編集現在の開発バージョンのソースコードはsorted()、道徳的に同等のことを行います

a = list(x)
a.sort()

実際、2 番目のバージョンの代わりにこのコードを使用すると、リスト サイズに関係なく速度の大幅な違いが解消されます。

于 2012-07-18T18:13:14.540 に答える
1

@Sven Marnachの回答を支持して:

小さなリストには小さな違いがあります。

$ python2.7 -mtimeit -s "x = [(2, 'bla'), (4, 'boo'), (3, 4), (1, 2) , (0, 1), (4, 3), (2, 1) , (0, 0)]; s=sorted" "a=s(x)"
1000000 loops, best of 3: 1.87 usec per loop

$ python2.7 -mtimeit -s "x = [(2, 'bla'), (4, 'boo'), (3, 4), (1, 2) , (0, 1), (4, 3), (2, 1) , (0, 0)]" "a=x[:];a.sort()"
1000000 loops, best of 3: 1.66 usec per loop

違いはなく* 1000なります(より大きなリスト):

$ python2.7 -mtimeit -s "x = [(2, 'bla'), (4, 'boo'), (3, 4), (1, 2) , (0, 1), (4, 3), (2, 1) , (0, 0)]*1000; s=sorted" "a=s(x)"
100 loops, best of 3: 3.42 msec per loop

$ python2.7 -mtimeit -s "x = [(2, 'bla'), (4, 'boo'), (3, 4), (1, 2) , (0, 1), (4, 3), (2, 1) , (0, 0)]*1000" "a=x[:];a.sort()"
100 loops, best of 3: 3.48 msec per loop
于 2012-07-18T18:20:36.970 に答える