私は既存の答えで簡単なベンチマークを行いました
- 標準ツールのみを使用します(
lua
またはのようなものについては申し訳ありませんrocket
)、
- 本物のワンライナーです
- 膨大な数(1億)を追加できる
- 高速です(1分以上かかったものは無視しました)。
私は常に、1〜1億の数値を追加しました。これは、いくつかのソリューションで1分未満で私のマシンで実行できました。
結果は次のとおりです。
パイソン
:; 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ソリューションは約30%から11秒までのオーバーヘッドを追加するだけです。しかし、公平を期すために、Pypyは厳密には標準ではありません。ほとんどの人はCPythonをインストールしているだけで、これは非常に遅い(22秒)、人気のあるAwkソリューションとまったく同じ速さです。
標準ツールに基づく最速のソリューションはPerl(15秒)です。