Это скорее дополнительный анализ, чем фактический ответ, но, похоже, он варьируется в зависимости от сортируемых данных. Во-первых, базовое чтение:
$ 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
ОК, Python намного быстрее. Тем не менее, вы можете сделать 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
опция, казалось, не имела большого (или какого-либо) значения в моих тестах. В заключение, предположительно из-за различных алгоритмов, упомянутых в ответе Златовласки, python 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 Тот, у кого больше python-fu, чем я, должен попытаться проверить настройку, list.sort()
чтобы увидеть ту же скорость, может быть достигнут путем указания метода сортировки.