Esto es más un análisis adicional que una respuesta real, pero parece variar según los datos que se ordenan. Primero, una lectura base:
$ 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 es mucho más rápido. Sin embargo, puede hacer que los coreutils sean sort
más rápidos diciéndole que ordene numéricamente:
$ 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
Eso es mucho más rápido, pero Python aún gana por un amplio margen. Ahora, intentemos de nuevo pero con una lista no ordenada de números 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
Coreutils sort -n
es más rápido para datos numéricos sin clasificar (aunque es posible que pueda modificar el cmp
parámetro de ordenación de Python para hacerlo más rápido). Coreutils sort
sigue siendo significativamente más lento sin la -n
bandera. Entonces, ¿qué pasa con los caracteres aleatorios, no con los 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
Python aún supera a los coreutils pero por un margen mucho menor que el que muestra en su pregunta. Sorprendentemente, aún es más rápido cuando se observan datos 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
También es importante tener en cuenta que los dos no producen la misma salida ordenada:
$ 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
Por extraño que parezca, la --buffer-size
opción no parecía hacer mucha (o ninguna) diferencia en mis pruebas. En conclusión, presumiblemente debido a los diferentes algoritmos mencionados en la respuesta de goldilock, python sort
parece ser más rápido en la mayoría de los casos, pero GNU numérico losort
supera en números no ordenados 1 .
El OP probablemente ha encontrado la causa raíz, pero en aras de la exhaustividad, aquí hay una comparación 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 Alguien con más python-fu del que debería intentar probar los ajustes list.sort()
para ver que se puede lograr la misma velocidad especificando el método de clasificación.