Я зробив швидкий орієнтир на існуючі відповіді, які
- використовувати лише стандартні інструменти (вибачте за такі речі, як
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
Тому я здогадуюсь, що для 100 мільйонів чисел це знадобилося б ~ 35s.
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 (15s).