我已经对现有答案进行了快速基准测试
- 仅使用标准工具(对于
lua 或rocket 之类的内容,请见谅),
- 是真正的单线,
- 能够添加大量数字(1 亿),并且
- 很快(我忽略了那些耗时超过一分钟的)。
我总是将 1 到 1 亿的数字相加,这可以在我的机器上在一分钟内完成多种解决方案。
结果如下:
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
粘贴 & Bc
这在我的机器上耗尽了内存。它适用于输入大小的一半(5000 万个数字):
:; seq 50000000 | paste -s -d+ - | bc
1250000025000000
# 17s
:; seq 50000001 100000000 | paste -s -d+ - | bc
3750000025000000
# 18s
所以我猜这 1 亿个数字大约需要 35 秒。
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
为了比较,我编译了 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 解决方案仅在 11 秒内增加了大约 30% 的少量开销。但是,公平地说,Pypy 并不完全是标准的。大多数人只安装了 CPython,它的速度要慢得多(22 秒),与流行的 Awk 解决方案一样快。
基于标准工具的最快解决方案是 Perl (15s)。