Ini lebih merupakan analisis tambahan daripada jawaban yang sebenarnya tetapi tampaknya bervariasi tergantung pada data yang diurutkan. Pertama, bacaan dasar:
$ 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 jauh lebih cepat. Namun, Anda dapat membuat core sort
lebih cepat dengan menyuruhnya mengurutkan secara numerik:
$ 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
Itu jauh lebih cepat tetapi python masih menang dengan selisih yang lebar. Sekarang, mari kita coba lagi tetapi dengan daftar nomor 1M yang tidak disortir:
$ 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
Coreutils sort -n
lebih cepat untuk data numerik yang tidak disortir (meskipun Anda mungkin dapat mengubah cmp
parameter python sort untuk membuatnya lebih cepat). Coreutils sort
masih jauh lebih lambat tanpa -n
flag. Jadi, bagaimana dengan karakter acak, bukan angka murni?
$ 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 masih mengalahkan coreutils tetapi dengan margin yang jauh lebih kecil dari apa yang Anda tunjukkan dalam pertanyaan Anda. Yang mengejutkan, ini masih lebih cepat ketika melihat data alfabet murni:
$ 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
Penting juga untuk dicatat bahwa keduanya tidak menghasilkan output yang diurutkan yang sama:
$ 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
Anehnya, --buffer-size
pilihan itu tampaknya tidak membuat banyak (atau ada) perbedaan dalam tes saya. Sebagai kesimpulan, mungkin karena berbagai algoritma yang disebutkan dalam jawaban goldilock, python sort
tampaknya lebih cepat dalam banyak kasus tetapi GNU numeriksort
mengalahkannya pada angka 1 yang tidak disortir .
OP mungkin telah menemukan akar penyebabnya tetapi demi kelengkapan, inilah perbandingan terakhir:
$ 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 Seseorang dengan lebih banyak python-fu daripada saya harus mencoba menguji tweaking list.sort()
untuk melihat dengan kecepatan yang sama dapat dicapai dengan menentukan metode penyortiran.