Fiz uma referência rápida nas respostas existentes que
- use apenas ferramentas padrão (desculpe por coisas como
lua
ou rocket
),
- são one-liners reais,
- são capazes de adicionar grandes quantidades de números (100 milhões) e
- são rápidos (eu ignorei os que levaram mais de um minuto).
Sempre adicionei os números de 1 a 100 milhões que eram factíveis na minha máquina em menos de um minuto para várias soluções.
Aqui estão os resultados:
Pitão
:; 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
Colar & Bc
Isso ficou sem memória na minha máquina. Funcionou para metade do tamanho da entrada (50 milhões de números):
:; seq 50000000 | paste -s -d+ - | bc
1250000025000000
# 17s
:; seq 50000001 100000000 | paste -s -d+ - | bc
3750000025000000
# 18s
Então eu acho que levaria aproximadamente 35s para os 100 milhões de números.
Perl
:; seq 100000000 | perl -lne '$x += $_; END { print $x; }'
5000000050000000
# 15s
:; seq 100000000 | perl -e 'map {$x += $_} <> and print $x'
5000000050000000
# 48s
Rubi
:; seq 100000000 | ruby -e "puts ARGF.map(&:to_i).inject(&:+)"
5000000050000000
# 30s
C
Apenas para fins de comparação, compilei a versão C e testei isso também, apenas para ter uma idéia de quanto as soluções baseadas em ferramentas são mais lentas.
#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
Conclusão
É claro que C é mais rápido com 8s, mas a solução Pypy adiciona apenas uma sobrecarga muito pequena de cerca de 30% a 11s . Mas, para ser justo, o Pypy não é exatamente padrão. A maioria das pessoas tem apenas o CPython instalado, o que é significativamente mais lento (22s), exatamente tão rápido quanto a solução Awk popular.
A solução mais rápida baseada em ferramentas padrão é o Perl (15s).