gpt4 book ai didi

python - 为什么这段 Haskell 代码这么慢?

转载 作者:太空狗 更新时间:2023-10-29 22:12:41 25 4
gpt4 key购买 nike

我是 Haskell 的新手,尝试制作一个拼字游戏求解器。它接受您当前拥有的字母,找到它们的所有排列并过滤掉那些字典单词。代码非常简单:

import Data.List

main = do
dict <- readFile "words"
letters <- getLine
let dictWords = words dict
let perms = permutations letters
print [x | x <- perms, x `elem` dictWords]

然而,与我使用 Python 进行的非常相似的实现相比,它的速度非常慢。我做错了什么基本的事情吗?

*编辑:这是我的 Python 代码:

from itertools import permutations

letters = raw_input("please enter your letters (without spaces): ")

d = open('words')
dictionary = [line.rstrip('\n') for line in d.readlines()]
d.close()

perms = ["".join(p) for p in permutations(letters)]

validWords = []

for p in perms:
if p in dictionary: validWords.append(p)


for validWord in validWords:
print validWord

我没有对它们进行精确计时,但大致感觉 Python 实现的速度大约是 Haskell 实现的 2 倍。也许我不应该说相比之下 Haskell 代码“慢得令人难以置信”,但由于 Haskell 是静态类型的,我想我只是认为它应该快得多,而且一点也不比 Python 慢。

最佳答案

I'm kind of new to Haskell and tried making a scrabble solver.

您可以通过使用更好的算法来显着改进。

不是测试输入字母的每个排列,如果你首先对它们进行排序,您只能进行一次字典查找并获得所有可能的单词(字谜)可能由他们(使用所有这些)。

这是将字典创建为 Data.Map 的代码。创建 map 需要启动成本,但之后第一个查询后续查找非常快。

import Data.List
import qualified Data.Map.Strict as Map
import Control.Monad
import System.IO

main = do
contents <- readFile "words"
let pairs = [ (sort w, [w]) | w <- words contents ]
dict = foldl' (\m (k,v) -> Map.insertWith (++) k v m) Map.empty pairs
-- dict = foldr (\(k,v) m -> Map.insertWith (++) k v m) Map.empty pairs
forever $ do
putStr "Enter letters: " >> hFlush stdout
letters <- getLine
case Map.lookup (sort letters) dict of
Nothing -> putStrLn "No words."
Just ws -> putStrLn $ "Words: " ++ show ws

一个 236K 字 (2.5 MB) 的字文件的 map 创建时间约为 4-5 秒。使用 ByteString 或 Text 而不是 String 可能会获得更好的性能。

尝试一些不错的字母组合:

steer rat tuna lapse groan neat

注意:使用 GHC 7.10.2 我发现此代码在使用 -O2 进行编译时表现最佳。

关于python - 为什么这段 Haskell 代码这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39283047/

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