Jestem trochę nowy w Haskell i próbowałem zrobić solver scrabble. Przyjmuje listy, które obecnie masz, znajduje wszystkie ich permutacje i odfiltrowuje te, które są słowami słownikowymi. Kod jest całkiem prosty:Dlaczego ten kod Haskella jest tak wolny?
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]
Jest jednak niesamowicie powolny w porównaniu do bardzo podobnej implementacji, jaką mam w Pythonie. Czy coś fundamentalnego robię źle?
* edit: Oto mój kod 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
nie miałem czasu na ich dokładnie, ale z grubsza to czuje się jak implementacja Pythona jest około 2x szybciej niż jednego Haskell. Być może nie powinienem był mówić, że kod Haskella był "niesamowicie wolny" w porównaniu, ale ponieważ Haskell jest statycznie napisany, wydaje mi się, że po prostu pomyślałem, że powinien być znacznie szybszy, a nie wolniejszy niż Python.
Czy możesz umieścić kod Pythona i niektóre testy porównawcze? –
'words dict' to tylko lista, a' elem' przeprowadza sekwencyjne wyszukiwanie na liście. – ErikR
Ciągi są połączonymi listami w Haskell. Użyj typu tekstu. –