我刚开始尝试在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中使用常规字符串只是表现不佳?