Dies ist eher eine zusätzliche Analyse als eine tatsächliche Antwort, scheint jedoch in Abhängigkeit von den zu sortierenden Daten zu variieren. Zunächst eine Basislesung:
$ 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 ist viel schneller. Sie können coreutils jedoch sort
schneller machen, indem Sie ihm sagen, dass er numerisch sortieren soll:
$ 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
Das ist viel schneller, aber Python gewinnt immer noch mit großem Abstand. Versuchen wir es jetzt noch einmal, aber mit einer nicht sortierten Liste von 1 Million Zahlen:
$ 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
Die Funktion coreutils sort -n
ist schneller für unsortierte numerische Daten (obwohl Sie möglicherweise den cmp
Parameter der Python-Sortierung optimieren können , um sie schneller zu machen). Coreutils sort
ist ohne -n
Flagge noch deutlich langsamer . Also, was ist mit zufälligen Zeichen, nicht reinen Zahlen?
$ 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 schlägt Coreutils immer noch, aber mit einem viel geringeren Abstand als das, was Sie in Ihrer Frage zeigen. Überraschenderweise ist es bei reinen alphabetischen Daten immer noch schneller:
$ 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
Es ist auch wichtig zu beachten, dass die beiden nicht die gleiche sortierte Ausgabe erzeugen:
$ 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
Seltsamerweise --buffer-size
schien die Option bei meinen Tests keinen großen (oder keinen) Unterschied zu machen. Vermutlich aufgrund der verschiedenen Algorithmen, die in Goldilocks Antwort erwähnt wurden, sort
scheint Python in den meisten Fällen schneller zu sein, aber numerische GNU sort
schlägt es mit unsortierten Zahlen 1 .
Das OP hat wahrscheinlich die Ursache gefunden, aber der Vollständigkeit halber hier ein letzter Vergleich:
$ 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 Jemand mit mehr Python-Fu, als ich versuchen sollte, das Tweaken zu testen list.sort()
, um die gleiche Geschwindigkeit zu erzielen, kann durch Angabe der Sortiermethode erreicht werden.