Tôi đã thực hiện một điểm chuẩn nhanh về các câu trả lời hiện có
- chỉ sử dụng các công cụ tiêu chuẩn (xin lỗi cho những thứ như
lua
hoặc rocket
),
- là một lớp lót thực sự,
- có khả năng thêm số lượng lớn (100 triệu) và
- rất nhanh (tôi bỏ qua những cái mất nhiều hơn một phút).
Tôi luôn thêm các con số từ 1 đến 100 triệu có thể thực hiện được trên máy của mình trong chưa đầy một phút cho một số giải pháp.
Đây là kết quả:
Con tră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
Dán & Bc
Điều này đã hết bộ nhớ trên máy của tôi. Nó hoạt động với một nửa kích thước của đầu vào (50 triệu số):
:; seq 50000000 | paste -s -d+ - | bc
1250000025000000
# 17s
:; seq 50000001 100000000 | paste -s -d+ - | bc
3750000025000000
# 18s
Vì vậy, tôi đoán nó sẽ mất ~ 35 giây cho 100 triệu số.
Perl
:; seq 100000000 | perl -lne '$x += $_; END { print $x; }'
5000000050000000
# 15s
:; seq 100000000 | perl -e 'map {$x += $_} <> and print $x'
5000000050000000
# 48s
Hồng ngọc
:; seq 100000000 | ruby -e "puts ARGF.map(&:to_i).inject(&:+)"
5000000050000000
# 30s
C
Chỉ để so sánh, tôi đã biên soạn phiên bản C và cũng đã thử nghiệm điều này, chỉ để có ý tưởng về các giải pháp dựa trên công cụ chậm hơn bao nhiêu.
#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
Phần kết luận
C tất nhiên là nhanh nhất với 8 giây , nhưng giải pháp Pypy chỉ thêm rất ít chi phí khoảng 30% đến 11 giây . Nhưng, công bằng mà nói, Pypy không chính xác theo tiêu chuẩn. Hầu hết mọi người chỉ cài đặt CPython chậm hơn đáng kể (22s), nhanh chính xác như giải pháp Awk phổ biến.
Giải pháp nhanh nhất dựa trên các công cụ tiêu chuẩn là Perl (15 giây).