He hecho un punto de referencia rápido sobre las respuestas existentes que
- use solo herramientas estándar (perdón por cosas como
lua
o rocket
),
- son frases reales,
- son capaces de agregar grandes cantidades de números (100 millones), y
- son rápidos (ignoré los que tomaron más de un minuto).
Siempre agregué los números de 1 a 100 millones que era factible en mi máquina en menos de un minuto para varias soluciones.
Aquí están los resultados:
Pitón
:; 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
Pasta y Bc
Esto se quedó sin memoria en mi máquina. Funcionó por la mitad del tamaño de la entrada (50 millones de números):
:; seq 50000000 | paste -s -d+ - | bc
1250000025000000
# 17s
:; seq 50000001 100000000 | paste -s -d+ - | bc
3750000025000000
# 18s
Entonces supongo que habría tomado ~ 35s para los 100 millones 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
Rubí
:; seq 100000000 | ruby -e "puts ARGF.map(&:to_i).inject(&:+)"
5000000050000000
# 30s
C
Solo por el bien de la comparación, compilé la versión C y probé esto también, solo para tener una idea de cuánto más lentas son las soluciones basadas en herramientas.
#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
Conclusión
C es, por supuesto, el más rápido con 8s, pero la solución Pypy solo agrega una sobrecarga muy pequeña de aproximadamente 30% a 11s . Pero, para ser justos, Pypy no es exactamente estándar. La mayoría de las personas solo tienen instalado CPython, que es significativamente más lento (22 s), exactamente tan rápido como la popular solución Awk.
La solución más rápida basada en herramientas estándar es Perl (15s).