为什么这个Haskell IO代码这么慢?

时间:2015-02-21 23:33:53

标签: haskell io

我刚开始尝试在Haskell中找出IO和懒惰的IO,而我写的这个例子非常慢。它只读取一个10M整数的文件并计算最大值。

import System.IO

maxNum :: [String] -> Int
maxNum = maximum . map getInt
    where getInt x = read x :: Int

main = do
    inh <- openFile "randints.txt" ReadMode
    contents <- hGetContents inh
    let myMax = maxNum $ lines contents
    putStrLn $ show myMax

我编写的简单Python版本的运行速度提高了大约6倍:

inh = open('randints.txt', 'r')

my_max = max(int(line) for line in inh)

print my_max

hGetContents应该是懒惰的,所以我不认为它首先将整个文件读入内存。分析器显示93%的时间花在了maxNum.getInt上,但是我没有足够的经验(或根本没有)分析Haskell,因为懒惰的评估来判断这是否是一个红色的鲱鱼。

我做错了什么,以某种方式打破了懒惰?或者在Haskell中使用常规字符串只是表现不佳?

0 个答案:

没有答案