Я как бы новичок в Haskell и попытался сделать решателя скребок. Он берет в письмах, которые у вас есть, находит все перестановки и отфильтровывает те слова, которые являются словарями. довольно просто Кодекса:Почему этот код 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 около 2х так быстро, как Haskell один. Возможно, мне следовало бы сказать, что код Haskell был «невероятно медленным» в сравнении, но поскольку Haskell статически типизирован, я думаю, я просто подумал, что он должен быть намного быстрее и не медленнее, чем Python вообще.
Можете ли вы опубликовать код Python и некоторые эталонные тесты? –
'words dict' - это просто список, а' elem' выполняет последовательный поиск по списку. – ErikR
Строки связаны списками в Haskell. Используйте тип текста. –