私はハスケルには新しく、スクラブルソルバーを作ろうとしました。あなたが現在持っている手紙を取り込み、それらのすべての順列を見つけ、辞書の単語であるものを取り除きます。コードのかなりシンプル:それは私は、Pythonで持っている非常によく似た実装に比べ、非常に遅いですがなぜこの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コードだ:
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のリンクリストです。テキストタイプを使用します。 –