Il s'agit plus d'une analyse supplémentaire que d'une réponse réelle, mais elle semble varier en fonction des données triées. Tout d'abord, une lecture de 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 est beaucoup plus rapide. Cependant, vous pouvez rendre les coreutils sort
plus rapides en lui disant de trier numériquement:
$ 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
C'est beaucoup plus rapide mais python gagne toujours par une large marge. Maintenant, réessayons mais avec une liste non triée de numéros 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
Le coreutils sort -n
est plus rapide pour les données numériques non triées (bien que vous puissiez modifier le cmp
paramètre du tri python pour le rendre plus rapide). Coreutils sort
est encore beaucoup plus lent sans le -n
drapeau. Alors, qu'en est-il des caractères aléatoires, pas des nombres purs?
$ 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 bat toujours coreutils mais avec une marge beaucoup plus petite que ce que vous montrez dans votre question. Étonnamment, il est encore plus rapide lorsque l'on regarde des données alphabétiques pures:
$ 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
Il est également important de noter que les deux ne produisent pas la même sortie triée:
$ 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
Curieusement, l' --buffer-size
option ne semblait pas faire beaucoup (ou aucune) différence dans mes tests. En conclusion, probablement en raison des différents algorithmes mentionnés dans la réponse de goldilock, le python sort
semble être plus rapide dans la plupart des cas, mais GNU numérique lesort
bat sur les nombres non triés 1 .
L'OP a probablement trouvé la cause première, mais pour être complet, voici une comparaison 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 Quelqu'un avec plus de python-fu que je devrais essayer de tester l'ajustement list.sort()
pour voir la même vitesse peut être obtenu en spécifiant la méthode de tri.