기존 답변에 대한 빠른 벤치 마크를 수행했습니다.
- 표준 도구 만 사용하십시오 (
lua
또는 같은 것들에 대해서는 죄송합니다 rocket
).
- 진짜 원 라이너입니다
- 엄청난 양의 숫자 (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
어 wk
:; seq 100000000 | awk '{s+=$1} END {print s}'
5000000050000000
# 22s
붙여 넣기 및 BC
컴퓨터의 메모리가 부족합니다. 입력 크기의 절반 (5 천만 숫자)으로 작동했습니다.
:; seq 50000000 | paste -s -d+ - | bc
1250000025000000
# 17s
:; seq 50000001 100000000 | paste -s -d+ - | bc
3750000025000000
# 18s
그래서 1 억 개의 숫자에 대해 ~ 35s를 차지했을 것입니다.
펄
:; 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 만 설치했는데, 이는 인기있는 Awk 솔루션만큼 정확하게 (22 초) 상당히 느립니다.
표준 툴을 기반으로하는 가장 빠른 솔루션은 Perl (15s)입니다.