Python程序运行速度很慢。

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))

你的单词列表有多大?您每组合读取一次。 - Thomas Fenzl
单词列表是所有英语单词的列表。 - kyle k
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)

谢谢,问题已解决。我会尽快接受您的答案。 - kyle k
谢谢,这使得它的工作非常好。如何使它只显示“true”单词,或者这是错误的地方提问?我认为我应该在“编程难题和代码高尔夫”网站上提问。 - kyle k
使用一个 if 测试?而不是当前的 print 语句,如果单词在英语中,则打印单词。这并不是很难做到。 - Martijn Pieters
@kylek:但是直接打印出我筛选过的 english_words 集合会更快,而不是重新生成所有可能的四个字母组合。我在答案末尾生成的集合包含了所有与你的四个字母组合循环匹配的四个字母单词。 - Martijn Pieters
谢谢,你的帮助非常大,所有问题都已经解决了,我没有进一步的问题。 - kyle k

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接