Si tratta più di un'analisi aggiuntiva che di una risposta effettiva, ma sembra variare a seconda dei dati ordinati. Innanzitutto, una lettura di 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 è molto più veloce. Tuttavia, puoi rendere i coreutil sort
più veloci dicendogli di ordinare 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
È molto più veloce, ma Python vince ancora con un ampio margine. Ora, riproviamo ma con un elenco non ordinato di numeri 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
Il coreutils sort -n
è più veloce per i dati numerici non ordinati (anche se potresti essere in grado di modificare il cmp
parametro dell'ordinamento python per renderlo più veloce). Coreutils sort
è ancora significativamente più lento senza la -n
bandiera. E i personaggi casuali, non i numeri puri?
$ 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 batte ancora coreutils ma con un margine molto più piccolo di quello che mostri nella tua domanda. Sorprendentemente, è ancora più veloce se si osservano dati alfabetici puri:
$ 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
È anche importante notare che i due non producono lo stesso output ordinato:
$ 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
Stranamente, l' --buffer-size
opzione non sembrava fare molta (o nessuna) differenza nei miei test. In conclusione, presumibilmente a causa dei diversi algoritmi menzionati nella risposta di goldilock, il pitone sort
sembra essere più veloce nella maggior parte dei casi, ma GNU numericosort
lo batte su numeri non ordinati 1 .
L'OP ha probabilmente trovato la causa principale, ma per completezza, ecco un confronto finale:
$ 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 Qualcuno con più python-fu di quanto dovrei provare a testare la modifica list.sort()
per vedere la stessa velocità può essere raggiunto specificando il metodo di ordinamento.