如何让我的python解码代码更高效?

时间:2014-11-08 15:54:26

标签: python itertools

我的代码

from itertools import permutations

original = str(input('What word would you like to unscramble?: '))

gen = []
for bob in permutations(original):
    gen.append(''.join(bob))



inputFile = open('dic.txt', 'r')
compare = inputFile.read().split('\n')
inputFile.close()

rondo = set(john for john in gen if john in compare)

for magic in rondo:
    print(magic)

我用它来解读单词,通过查找单词的所有可能排列并将每个排列与字典进行比较来找到真实单词,然后返回那些真实单词。但是,超过8个字母会导致错误,因为在程序完成之前我用完了ram,而带有7或8个字母的单词需要很长时间才能解读。我想知道是否有办法让我的代码能够用更长的单词更快地运行,以及增加最大字长的方法。我正在使用Python 3,如果重要的话,我有点像初学者。

2 个答案:

答案 0 :(得分:2)

不应将所有排列附加到列表中,而应直接迭代它们。

set(''.join(john) for john in permutations(original) if ''.join(john) in compare)

set(john for john in (''.join(bob) for bob in permutations(original)) if john in compare)

找到解决方案的更好方法是通过创建从字母到计数的地图或通过对字母进行排序来创建单词的签名。然后,您只需要将加扰字的签名与单词列表中的签名进行比较。

words = {}
for word in compare:
    key = ''.join(sorted(word))
    if key in words:
        words[key].add(word)
    else:
        words[key] = {word}

return words[''.join(sorted(original))]

答案 1 :(得分:1)

您可以使用生成器而不是列表:

gen = ( ''.join(bob) for bob in permutations(original))

这样可以节省内存使用量。

这里有关于生成器与列表推导的使用的良好讨论:Generator Expressions vs. List Comprehension

这里还有另一个很好的讨论:Understanding Generators in Python