Ich habe einen schnellen Benchmark der vorhandenen Antworten durchgeführt, der
- nur Standardwerkzeuge verwenden (Entschuldigung für Dinge wie
lua
o rocket
),
- sind echte Einzeiler,
- sind in der Lage, riesige Zahlenmengen zu addieren (100 Millionen), und
- schnell sind (die, die länger als eine Minute dauern, habe ich ignoriert).
Ich habe immer die Zahlen von 1 bis 100 Millionen addiert, was auf meinem Rechner in weniger als einer Minute für mehrere Lösungen machbar war.
Hier sind die Ergebnisse:
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
Paste & Bc
Auf meinem Rechner ging der Speicherplatz aus. Es funktionierte für die halbe Größe der Eingabe (50 Millionen Zahlen):
:; seq 50000000 | paste -s -d+ - | bc
1250000025000000
# 17s
:; seq 50000001 100000000 | paste -s -d+ - | bc
3750000025000000
# 18s
Ich schätze also, dass es für die 100 Millionen Nummern ~35s gebraucht hätte.
Perl
:; seq 100000000 | perl -lne '$x += $_; END { print $x; }'
5000000050000000
# 15s
:; seq 100000000 | perl -e 'map {$x += $_} <> and print $x'
5000000050000000
# 48s
Rubinrot
:; seq 100000000 | ruby -e "puts ARGF.map(&:to_i).inject(&:+)"
5000000050000000
# 30s
C
Nur zum Vergleich habe ich die C-Version kompiliert und auch diese getestet, um eine Vorstellung davon zu bekommen, wie viel langsamer die toolbasierten Lösungen sind.
#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
Schlussfolgerung
C ist natürlich am schnellsten mit 8s, aber die Pypy-Lösung fügt nur einen sehr geringen Overhead von etwa 30% zu 11s hinzu . Aber, um fair zu sein, Pypy ist nicht gerade Standard. Die meisten Leute haben nur CPython installiert, das deutlich langsamer ist (22s), genau so schnell wie die beliebte Awk-Lösung.
Die schnellste Lösung auf der Grundlage von Standardwerkzeugen ist Perl (15s).