Isso é mais uma análise extra do que uma resposta real, mas parece variar dependendo dos dados que estão sendo classificados. Primeiro, uma leitura básica:
$ 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 é muito mais rápido. No entanto, você pode sort
acelerar o coreutils dizendo para ordenar numericamente:
$ 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
Isso é muito mais rápido, mas o python ainda vence por uma ampla margem. Agora, vamos tentar novamente, mas com uma lista não classificada de 1 milhão de números:
$ 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
O coreutils sort -n
é mais rápido para dados numéricos não classificados (embora você possa ajustar o cmp
parâmetro da classificação python para torná-lo mais rápido). Coreutils sort
ainda é significativamente mais lento sem a -n
bandeira. Então, e os caracteres aleatórios, não os números puros?
$ 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
O Python ainda supera os coreutils, mas por uma margem muito menor do que o que você mostra na sua pergunta. Surpreendentemente, ainda é mais rápido quando se olha para dados alfabéticos puros:
$ 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
Também é importante observar que os dois não produzem a mesma saída classificada:
$ 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
Curiosamente, a --buffer-size
opção não pareceu fazer muita (ou nenhuma) diferença nos meus testes. Em conclusão, presumivelmente por causa dos diferentes algoritmos mencionados na resposta do goldilock, o python sort
parece ser mais rápido na maioria dos casos, mas o GNU numérico osort
supera em números não classificados 1 .
O OP provavelmente encontrou a causa raiz, mas, para fins de completude, aqui está uma comparação final:
$ 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 Alguém com mais python-fu do que eu deveria tentar testar os ajustes list.sort()
para ver a mesma velocidade pode ser alcançado especificando o método de classificação.