J'ai fait une référence rapide sur les réponses existantes qui
- utilisez uniquement des outils standard (désolé pour des trucs comme
lua
ou rocket
),
- sont de vrais one-liners,
- sont capables d'ajouter d'énormes quantités de chiffres (100 millions), et
- sont rapides (j'ai ignoré ceux qui ont pris plus d'une minute).
J'ai toujours ajouté les nombres de 1 à 100 millions qui étaient réalisables sur ma machine en moins d'une minute pour plusieurs solutions.
Voici les résultats:
Python
:; seq 100000000 | python -c 'import sys; print sum(map(int, sys.stdin))'
5000000050000000
# 30s
:; seq 100000000 | python -c 'import sys; print sum(int(s) for s in sys.stdin)'
5000000050000000
# 38s
:; seq 100000000 | python3 -c 'import sys; print(sum(int(s) for s in sys.stdin))'
5000000050000000
# 27s
:; seq 100000000 | python3 -c 'import sys; print(sum(map(int, sys.stdin)))'
5000000050000000
# 22s
:; seq 100000000 | pypy -c 'import sys; print(sum(map(int, sys.stdin)))'
5000000050000000
# 11s
:; seq 100000000 | pypy -c 'import sys; print(sum(int(s) for s in sys.stdin))'
5000000050000000
# 11s
Awk
:; seq 100000000 | awk '{s+=$1} END {print s}'
5000000050000000
# 22s
Coller & Bc
Cela a manqué de mémoire sur ma machine. Cela a fonctionné pour la moitié de la taille de l'entrée (50 millions de numéros):
:; seq 50000000 | paste -s -d+ - | bc
1250000025000000
# 17s
:; seq 50000001 100000000 | paste -s -d+ - | bc
3750000025000000
# 18s
Je suppose donc qu'il aurait fallu environ 35 secondes pour les 100 millions de numéros.
Perl
:; seq 100000000 | perl -lne '$x += $_; END { print $x; }'
5000000050000000
# 15s
:; seq 100000000 | perl -e 'map {$x += $_} <> and print $x'
5000000050000000
# 48s
Rubis
:; seq 100000000 | ruby -e "puts ARGF.map(&:to_i).inject(&:+)"
5000000050000000
# 30s
C
À titre de comparaison, j'ai compilé la version C et je l'ai également testée, juste pour avoir une idée de la lenteur des solutions basées sur les outils.
#include <stdio.h>
int main(int argc, char** argv) {
long sum = 0;
long i = 0;
while(scanf("%ld", &i) == 1) {
sum = sum + i;
}
printf("%ld\n", sum);
return 0;
}
:; seq 100000000 | ./a.out
5000000050000000
# 8s
Conclusion
C est bien sûr le plus rapide avec 8 s, mais la solution Pypy n'ajoute qu'un très petit surcoût d'environ 30% à 11 s . Mais, pour être juste, Pypy n'est pas exactement standard. La plupart des gens n'ont installé que CPython, ce qui est beaucoup plus lent (22 s), exactement aussi vite que la solution Awk populaire.
La solution la plus rapide basée sur des outils standard est Perl (15s).