gpt4 book ai didi

当我从文件读取 map 时,Haskell 比 Python 需要更多的内存。为什么?

转载 作者:行者123 更新时间:2023-12-02 14:01:48 25 4
gpt4 key购买 nike

我用 Python 编写了这个简单的代码:

input = open("baseforms.txt","r",encoding='utf8')
S = {}
for i in input:
words = i.split()
S.update( {j:words[0] for j in words} )
print(S.get("sometext","not found"))
print(len(S))

工作需要 300MB。 “baseforms.txt”大小为123M。我在 Haskell 中编写了相同的代码:

{-# LANGUAGE OverloadedStrings #-}
import qualified Data.Map as M
import qualified Data.ByteString.Lazy.Char8 as B
import Data.Text.Lazy.Encoding(decodeUtf8)
import qualified Data.Text.Lazy as T
import qualified Data.Text.Lazy.IO as I
import Control.Monad(liftM)

main = do
text <- B.readFile "baseforms.txt"
let m = (M.fromList . (concatMap (parseLine.decodeUtf8))) (B.lines text)
print (M.lookup "sometext" m)
print (M.size m)
where
parseLine line = let base:forms = T.words line in [(f,base)| f<-forms]

它需要 544 MB,并且比 Python 版本慢。为什么? Haskell版本可以优化吗?

最佳答案

Haskell 版本中发生了很多 Python 版本中没有发生的事情。

  • readFile 使用惰性 IO,总体来说有点奇怪。我通常会避免惰性 IO。

  • 文件作为字节串被分成几行,然后解码为 UTF-8。鉴于 Text IO 函数的存在,这似乎有点不必要。

  • Haskell 版本使用树 (Data.Map),而 Python 版本使用哈希表。

  • 这些字符串都是惰性的,如果它们相对较短,则可能没有必要。惰性字符串每个字符串有几个字的开销,这些开销会累加起来。您可以融合惰性字符串,或者可以一次读取所有文件,或者可以使用管道之类的东西。

  • GHC 使用复制收集器,而默认的 Python 实现使用 malloc() 以及引用计数和偶尔的 GC。仅这一事实就可以解释内存使用情况的巨大差异,具体取决于您的程序。

  • 谁知道 Haskell 版本中创建了多少 thunk。

  • 未知您是否启用了优化。

  • 不知道 Haskell 版本慢了多少。

  • 我们没有您的数据文件,因此我们无法自行测试。

关于当我从文件读取 map 时,Haskell 比 Python 需要更多的内存。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29254194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com