Ich habe einen kurzen Benchmark für die vorhandenen Antworten durchgeführt, die
- benutze nur Standardwerkzeuge (sorry für Sachen wie
lua
oder rocket
),
- sind echte Einzeiler,
- sind in der Lage, große Mengen von Zahlen (100 Millionen) hinzuzufügen, und
- sind schnell (ich habe diejenigen ignoriert, die länger als eine Minute gedauert haben).
Ich habe immer die Zahlen 1 bis 100 Millionen hinzugefügt, die für mehrere Lösungen in weniger als einer Minute auf meinem Computer ausgeführt werden konnten.
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 Computer ging der Speicher aus. Es funktionierte für die Hälfte der 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 denke, es hätte ~ 35 Sekunden für die 100 Millionen Zahlen gedauert.
Perl
:; seq 100000000 | perl -lne '$x += $_; END { print $x; }'
5000000050000000
# 15s
:; seq 100000000 | perl -e 'map {$x += $_} <> and print $x'
5000000050000000
# 48s
Rubin
:; seq 100000000 | ruby -e "puts ARGF.map(&:to_i).inject(&:+)"
5000000050000000
# 30s
C.
Nur zum Vergleich habe ich die C-Version kompiliert und auch getestet, um eine Vorstellung davon zu bekommen, wie viel langsamer die werkzeugbasierten 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
Fazit
C ist mit 8s natürlich am schnellsten, aber die Pypy-Lösung fügt 11s nur einen sehr geringen Overhead von etwa 30% hinzu . Aber um fair zu sein, ist Pypy 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, die auf Standardwerkzeugen basiert, ist Perl (15s).