Как часть задачи программирования, мне нужно прочитать из stdin последовательность целых чисел, разделенных пробелами (в одной строке), и напечатать сумму этих целых чисел в stdout. Эта последовательность может содержать целых 10 000 000 целых чисел.
У меня есть два решения для этого: один написан в Haskell (foo.hs
), а другой эквивалентный, написанный на Python 2 (foo.py
). К сожалению, (скомпилированная) программа Haskell последовательно медленнее, чем программа Python, и я затрудняюсь объяснить несоответствие производительности между двумя программами; см. раздел Benchmark ниже. Во всяком случае, я ожидал, что у Haskell хватит сил...
Что я делаю неправильно? Как я могу объяснить это несоответствие? Есть ли простой способ ускорить мой код Haskell?
(Для информации я использую MacBook Pro середины 2010 года с оперативной памятью 8 ГБ, GHC 7.8.4 и Python 2.7.9.)
foo.hs
main = print . sum =<< getIntList
getIntList :: IO [Int]
getIntList = fmap (map read . words) getLine
(скомпилирован с ghc -O2 foo.hs
)
foo.py
ns = map(int, raw_input().split())
print sum(ns)
Benchmark
В дальнейшем test.txt
состоит из одной строки из 10 миллионов целых чисел, разделенных пробелами.
# Haskell
$ time ./foo < test.txt
1679257
real 0m36.704s
user 0m35.932s
sys 0m0.632s
# Python
$ time python foo.py < test.txt
1679257
real 0m7.916s
user 0m7.756s
sys 0m0.151s