【发布时间】:2017-01-10 00:25:48
【问题描述】:
我对 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 实现的非常相似的实现相比,它的速度非常慢。有什么基本的我做错了吗?
*edit:这是我的 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 慢。
【问题讨论】:
-
你能发布 Python 代码和一些基准测试吗?
-
words dict只是一个列表,elem正在对列表执行顺序搜索。 -
字符串是 Haskell 中的链表。使用文本类型。
-
答案当然是“因为你使用了错误的数据结构”。
标签: python haskell optimization language-comparisons