4

该程序生成字母组合并检查它们是否是单词,但是该程序非常慢,每秒只能生成几个单词。请告诉我为什么它很慢,以及我需要什么让它更快

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

它很慢,因为您正在为每个循环迭代重新读取文件,并创建一个新的函数对象。这两件事都不依赖于循环变量。将这些移出循环以仅运行一次

此外,简单的函数可以内联;调用函数相对昂贵。也不要打''.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 回答