4

このプログラムは文字の組み合わせを生成し、それらが単語かどうかをチェックしますが、プログラムは非常に遅く、1 秒間に数単語しか生成しません。なぜ非常に遅いのか、それを速くするために何が必要なのか教えてください

import itertools 

for p1 in itertools.combinations('abcdefghijklmnopqrstuvwxyz', 4):
    with open('/Users/kyle/Documents/english words.txt') as word_file:
        english_words = set(word.strip().lower() for word in word_file)

    def is_english_word(word):
        return word.lower() in english_words

    print ''.join(p1),"is", is_english_word(''.join(p1))
4

1 に答える 1

13

ループの反復ごとにファイルを再読み込みし、新しい関数オブジェクトを作成するため、低速です。これら 2 つのことはどちらもループ変数に依存しません。これらをループの外に移動して、一度だけ実行します。

さらに、単純な関数はインライン化できます。関数の呼び出しは比較的高価です。''.join()また、二度電話しないでください。また、単語を生成するために小文字のみを使用しているため、.lower()冗長です。

with open('/Users/kyle/Documents/english words.txt') as word_file:
    english_words = set(word.strip().lower() for word in word_file)

for p1 in itertools.combinations('abcdefghijklmnopqrstuvwxyz', 4):
    word = ''.join(p1)
    print '{} is {}'.format(word, word in english_words)

長さ 4 の単語を生成しているので、英単語ファイルから長さ 4 の単語のみをロードすることで、メモリを節約できます。

with open('/Users/kyle/Documents/english words.txt') as word_file:
    english_words = set(word.strip().lower() for word in word_file if len(word.strip()) == 4)
于 2013-06-15T16:55:23.730 に答える