Я новичок в Haskell и пытался создать решатель Scrabble. Он берет буквы, которые у вас есть в настоящее время, находит все их перестановки и отфильтровывает те, которые являются словарными словами. Код довольно прост:
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 примерно в 2 раза быстрее, чем реализация Haskell. Возможно, я не должен был говорить, что код Haskell был «невероятно медленным» по сравнению с ним, но, поскольку Haskell статически типизирован, я думаю, я просто подумал, что он должен был быть намного быстрее, а вовсе не медленнее, чем Python.
words dict
— это просто список, аelem
выполняет последовательный поиск по списку. - person ErikR   schedule 02.09.2016Text
иSet
. Очень интересен вопрос о том, почему у этого решения производительность отличается от эквивалентного решения Python, и если вы опубликуете свой код Python, это может помочь нам разобраться. - person Ian Henry   schedule 02.09.2016Text
здесь не решает фундаментальной проблемы. - person dfeuer   schedule 03.09.2016