Я сделал быстрый тест на существующие ответы, которые
- используйте только стандартные инструменты (извините за такие вещи, как
lua
илиrocket
),
- настоящие однострочники,
- способны добавлять огромное количество чисел (100 миллионов) и
- быстрые (я проигнорировал те, которые заняли больше минуты).
Я всегда прибавлял числа от 1 до 100 миллионов, что было выполнимо на моей машине менее чем за минуту для нескольких решений.
Вот результаты:
питон
:; 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
Вставить & Bc
Это исчерпало память на моей машине. Это работало для половины размера ввода (50 миллионов чисел):
:; seq 50000000 | paste -s -d+ - | bc
1250000025000000
# 17s
:; seq 50000001 100000000 | paste -s -d+ - | bc
3750000025000000
# 18s
Так что, я думаю, это заняло бы ~ 35 с на 100 миллионов номеров.
Perl
:; seq 100000000 | perl -lne '$x += $_; END { print $x; }'
5000000050000000
# 15s
:; seq 100000000 | perl -e 'map {$x += $_} <> and print $x'
5000000050000000
# 48s
Рубин
:; seq 100000000 | ruby -e "puts ARGF.map(&:to_i).inject(&:+)"
5000000050000000
# 30s
С
Просто для сравнения я скомпилировал версию C и также протестировал ее, чтобы понять, насколько медленнее решения на основе инструментов.
#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
Вывод
C, конечно, быстрее всего с 8 секундами , но решение Pypy только добавляет очень небольшие накладные расходы, примерно от 30% до 11 секунд . Но, честно говоря, Pypy не совсем стандарт. У большинства людей установлен только CPython, который значительно медленнее (22 с), точно так же быстро, как и популярное решение Awk.
Самым быстрым решением на основе стандартных инструментов является Perl (15 с).