これは実際の回答よりも特別な分析ですが、ソートされるデータによって異なるようです。まず、基本的な読み:
$ printf "%s\n" {1..1000000} > numbers.txt
$ time python sort.py <numbers.txt >s1.txt
real 0m0.521s
user 0m0.216s
sys 0m0.100s
$ time sort <numbers.txt >s2.txt
real 0m3.708s
user 0m4.908s
sys 0m0.156s
OK、Pythonはずっと高速です。ただし、sort
数値でソートするように指示することにより、coreutilsを高速化できます。
$ time sort <numbers.txt >s2.txt
real 0m3.743s
user 0m4.964s
sys 0m0.148s
$ time sort -n <numbers.txt >s2.txt
real 0m0.733s
user 0m0.836s
sys 0m0.100s
それははるかに高速ですが、Pythonは依然として大きなマージンで勝ちます。今、もう一度試してみましょうが、ソートされていない1M番号のリストを使用します。
$ sort -R numbers.txt > randomized.txt
$ time sort -n <randomized.txt >s2.txt
real 0m1.493s
user 0m1.920s
sys 0m0.116s
$ time python sort.py <randomized.txt >s1.txt
real 0m2.652s
user 0m1.988s
sys 0m0.064s
sort -n
ソートされていない数値データの場合、coreutils は高速です(ただし、python sortのcmp
パラメーターを調整して高速化できる場合があります)。Coreutils sort
は、-n
フラグを使用しないと、依然として大幅に遅くなります。それでは、純粋な数字ではなく、ランダムな文字はどうでしょうか?
$ tr -dc 'A-Za-z0-9' </dev/urandom | head -c1000000 |
sed 's/./&\n/g' > random.txt
$ time sort <random.txt >s2.txt
real 0m2.487s
user 0m3.480s
sys 0m0.128s
$ time python sort.py <random.txt >s2.txt
real 0m1.314s
user 0m0.744s
sys 0m0.068s
Pythonはまだcoreutilsに勝っていますが、質問で示したものよりもはるかに小さいマージンです。驚いたことに、純粋なアルファベット順のデータを見ると、さらに高速です。
$ tr -dc 'A-Za-z' </dev/urandom | head -c1000000 |
sed 's/./&\n/g' > letters.txt
$ time sort <letters.txt >s2.txt
real 0m2.561s
user 0m3.684s
sys 0m0.100s
$ time python sort.py <letters.txt >s1.txt
real 0m1.297s
user 0m0.744s
sys 0m0.064s
また、2つは同じソートされた出力を生成しないことに注意することも重要です。
$ echo -e "A\nB\na\nb\n-" | sort -n
-
a
A
b
B
$ echo -e "A\nB\na\nb\n-" | python sort.py
-
A
B
a
b
奇妙なことに、この--buffer-size
オプションは私のテストであまり(または少しも)違いをもたらさないようでした。結論として、おそらくgoldilockの答えで言及されているさまざまなアルゴリズムのために、Python sort
はほとんどの場合より高速であるように見えますが、数値 GNU sort
はソートされていない数でそれを打ち負かします1。
OPが根本的な原因を見つけた可能性がありますが、完全を期すために、最後の比較を示します。
$ time LC_ALL=C sort <letters.txt >s2.txt
real 0m0.280s
user 0m0.512s
sys 0m0.084s
$ time LC_ALL=C python sort.py <letters.txt >s2.txt
real 0m0.493s
user 0m0.448s
sys 0m0.044s
1 ソート方法を指定することで、同じ速度を確認するために微調整list.sort()
をテストしようとするよりも多くのpython-fuを持っている人。