Це скоріше додатковий аналіз, ніж фактичний відповідь, але він, здається, змінюється залежно від сортованих даних. По-перше, базове читання:
$ 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
Добре, пітон набагато швидший. Однак ви можете зробити coreutils sort
швидше, запропонувавши їм сортувати чисельно:
$ 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
Це набагато швидше, але пітон все-таки виграє з великим відривом. Тепер спробуємо ще раз, але з несортиваним списком 1М чисел:
$ 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
швидше для несортованих числових даних (хоча ви, можливо, зможете налаштувати параметр сортування python, 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
Важливо також зазначити, що вони не дають однакового сортованого результату:
$ 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
варіант, схоже, не міг значно (або будь-яку) різницю в моїх тестах. На закінчення, мабуть, через різні алгоритми, згадані у відповіді Голділок, sort
в більшості випадків пітон здається більш швидким, але числовий GNU sort
перевершує його на несортні числа 1 .
ОП, ймовірно, знайшов першопричину, але задля повноти, ось остаточне порівняння:
$ 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()
щоб побачити однакову швидкість, можна досягти, вказавши метод сортування.