如何让这个程序运行得更快?

时间:2012-08-13 03:44:03

标签: python algorithm

所以这是我用Python编写的第一个程序之一。我正在尝试取一个字符串,并输出所有真正的单词字符串。我已经完成了(我需要找到一个包含更多单词的参考文件)但是它不可扩展,因为我不能输入超过8个字符而没有Python需要很长时间才能返回。

def lower_and_remove_spaces(fill_string):
    '''
    function takes a string of 2 or more characters and prints out all the permutations
    of words that the characters can make. 
    '''
    lower_string = ''

    for i in fill_string:
        if i.isalpha():
            lower_string += i.lower()

    return lower_string    

def fill_list(input_string):
   iter_list = []
   string_list = []
   this_string = lower_and_remove_spaces(input_string)
   for num in range(2,len(this_string)+1):
      iter_list.append(itertools.permutations(this_string,num))

   for iters in iter_list:
      for lists in iters:
         string_list.append(list(lists))

    return string_list

def word_list(string):
   string_list = fill_list(string)
   a_word_list = []
   a_string = ''
   for i in string_list:
      if not a_string == '':
         a_word_list.append(a_string)
      a_string = ''
      for y in i:
         a_string += y
    return a_word_list

据我所知,这种情况很多,但我想知道什么是更好的方法,以便它可以扩展?

1 个答案:

答案 0 :(得分:5)

一些快速的想法:让所有的排列都变成O(n!),没有办法解决这个问题。即使您优化了代码,当n接近更大的数字时,您仍会遇到问题。如果你有一个有效单词的字典,这个问题有点不同。在病理输入集(您的字典包含所有排列)下,您不能做得比这更好。

但是,您可以执行以下操作

  1. 在前缀树中保留有效字词的字典
  2. 以递归方式手动生成排列,而不是通过itertools.i.e。,选择一个字母,开始一个单词,递归
  3. 在每一步,检查前缀是否有效,否则修剪搜索树。
  4. 在实践中,这种表现要比O(n!)

    好得多

    如果您不熟悉前缀树,可以使用Python哈希来模拟相同的事情

       def prefix_hash(list_o_words):
           ret = {}
           for word in list_o_words:
               for i in range(2,len(word)-1):
                   ret[word[:i]] = 'prefix'  # this should check if it's a word first..
           ret[word] = 'word'
    

    如果您需要更多帮助,请提出问题。