Mevcut cevaplar hakkında kısa bir değerlendirme yaptım.
- sadece standart araçlar kullanın (
lua
veya gibi şeyler için özür dilerim rocket
),
- gerçek tek gömlekli,
- çok sayıda (100 milyon) rakam ekleyebilir ve
- hızlı (bir dakikadan uzun sürenleri görmezden geldim).
Her zaman birkaç ila birkaç dakika içinde makinemde yapılabilen 1 ila 100 milyon arasındaki sayıları ekledim.
Sonuçlar burada:
piton
:; 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
Yapıştır & Bc
Bu makinemde bellek kalmadı. Girdinin yarısı kadar çalıştı (50 milyon sayı):
:; seq 50000000 | paste -s -d+ - | bc
1250000025000000
# 17s
:; seq 50000001 100000000 | paste -s -d+ - | bc
3750000025000000
# 18s
Bu yüzden sanırım 100 milyon sayı için ~ 35s alacaktı.
Perl
:; seq 100000000 | perl -lne '$x += $_; END { print $x; }'
5000000050000000
# 15s
:; seq 100000000 | perl -e 'map {$x += $_} <> and print $x'
5000000050000000
# 48s
Yakut
:; seq 100000000 | ruby -e "puts ARGF.map(&:to_i).inject(&:+)"
5000000050000000
# 30s
C
Sadece karşılaştırma için, C sürümünü derledim ve bunu da test ettim, sadece araç tabanlı çözümlerin ne kadar yavaş olduğu hakkında bir fikrim var.
#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
Sonuç
C elbette 8 saniye ile en hızlı, ancak Pypy çözümü sadece yaklaşık% 30 ila 11 saniye arasında çok az ek yük getiriyor . Ancak, adil olmak gerekirse, Pypy tam olarak standart değildir. Çoğu insan sadece CPython yüklüdür ve bu da popüler Awk çözümü kadar hızlıdır.
Standart araçlara dayalı en hızlı çözüm Perl'dir (15s).