如何提高性能以更快地运行(python)

时间:2015-06-02 20:52:22

标签: performance python-3.x recursion

现在,我的程序花费超过10分钟LOL尝试显示可以从给定字母创建的所有可能的单词(如果这些单词在文件中)。在该文件中,它有超过4000多个单词 如何通过使用递归使我的程序运行得更快,而不是使用任何库,因为我是新手。

if user input letters: b d o s y

然后它会查找该文件中的所有可能单词来创建:

b
d
boy
boys
by

代码:

words = set()

def found(word, file):

##    Reads through file and tries
##    to match given word in a line.

    with open(file, 'r') as rf:
        for line in rf.readlines():
            if line.strip() == word:
                return True
        return False


def scramble(r_letters, s_letters):   
##    Output every possible combination of a word.
##    Each recursive call moves a letter from
##    r_letters (remaining letters) to
##    s_letters (scrambled letters)

    if s_letters:
        words.add(s_letters)
    for i in range(len(r_letters)):
        scramble(r_letters[:i] + r_letters[i+1:], s_letters + r_letters[i])

thesarus = input("Enter the name of the file containing all of the words: ")
letters  = input("Please enter your letters separated by a space: ")
word = ''.join(letters.split(' '))
scramble(word, '')
ll = list(words)
ll.sort()
for word in ll:
    if found(word, thesarus):
        print(word)

1 个答案:

答案 0 :(得分:0)

您的程序运行缓慢,因为您的算法效率低下。 由于您在问题中需要使用递归(以生成所有可能的组合),因此至少可以改进您在文件中搜索的方式。

您的代码打开文件并搜索单个单词,为每个单词读取它。这是非常低效的。

我想到的第一个解决方案是读取文件一次并将每个单词保存在set()

words_set = {line.strip() for line in open('somefile')}

或者(简洁)

words_set = set()
with open('somefile') as fp:
    for line in fp:
        words_set.add(line.strip())

然后,你就这样做了

if word in words_set:
     print(word)

我认为可以有更有效的方法来完成整个程序,但它们不需要递归。

更新

为了便于讨论,我认为提供更好的算法可能是有用的。

除了文件中针对每个单词的低效搜索之外,您的代码还会生成所有可能的组合,即使这些组合不太可能是字典的一部分。

更好的解决方案是以更有效的方式存储单词,这样可以更容易地判断特定组合是否存在。例如,您不希望访问(在文件中)由用户提供的列表中不存在的字符组成的所有单词。

我认为有一种数据结构对这类问题非常有效:trie(或前缀树)。此数据结构可用于存储所有同义词库文件,而不是我上面建议的集合。

然后,您只需访问具有所有可能字母的树,而不是生成所有可能的字母组合,以找到所有可能的有效字词。

因此,例如,如果您的用户输入h o m e x并且您的同义词库中没有以x开头的单词,则不会生成以x开头的所有排列,例如xe,xo,xh,xm等,节省了大量的计算。