python - 如何提高这个递归函数的性能?

标签 python performance recursion

我正在尝试编写一个函数,该函数将在 str 中搜索 substr,同时考虑到编写奇怪字母的不同可能性,例如丹麦语中的 æ、ø、å。例如,您可以搜索“Ålborg”,如果存在,函数将返回 true,在 str 中说“Aalborg”。

下面的功能可以,但是性能不堪。您会推荐什么来提高性能?

def danish_tolerating_search(substr, str):
    '''Figure out if substr is in str, taking into account
    possible deviations in writing letters æ, ø, å.
    æ  <->  ae a ea
    ø  <->  oe o
    å  <->  aa a o
    '''

    # normalize input
    substr = substr.lower().replace('aa',u'å')
    str = str.lower()

    # normalized recursive search
    # TODO fix perfomance
    def s(substr, str):
        if str.find(substr) >= 0: return True
        if substr.find(u'æ') >= 0:
            if    s(substr.replace(u'æ','ae', 1), str): return True
            elif  s(substr.replace(u'æ', 'a', 1), str): return True
            elif  s(substr.replace(u'æ','ea', 1), str): return True
        if str.find(u'æ') >= 0:
            if    s(substr, str.replace(u'æ','ae', 1)): return True
            elif  s(substr, str.replace(u'æ', 'a', 1)): return True
            elif  s(substr, str.replace(u'æ','ea', 1)): return True
        if substr.find(u'ø') >= 0:
            if    s(substr.replace(u'ø','oe', 1), str): return True
            elif  s(substr.replace(u'ø', 'o', 1), str): return True
        if str.find(u'ø') >= 0:
            if    s(substr, str.replace(u'ø','oe', 1)): return True
            elif  s(substr, str.replace(u'ø', 'o', 1)): return True
        if substr.find(u'å') >= 0:
            if    s(substr.replace(u'å','aa', 1), str): return True
            elif  s(substr.replace(u'å', 'a', 1), str): return True
            elif  s(substr.replace(u'å', 'o', 1), str): return True
        if str.find(u'å') >= 0:
            if    s(substr, str.replace(u'å','aa', 1)): return True
            elif  s(substr, str.replace(u'å', 'a', 1)): return True
            elif  s(substr, str.replace(u'å', 'o', 1)): return True
        return False

    return s(substr, str)

最佳答案

我认为你应该完全消除递归。例如,您可以决定输入字符串的“正常形式”,并相应地转换它们(即替换那些“不明确的” "字符)并做一个简单的

return substring in string_

另请注意,您不需要同时调用findreplace,后者就足够了。如果未找到搜索字符串,则替换不会替换任何内容。

关于python - 如何提高这个递归函数的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6538661/

相关文章:

c++ - 比较从递归树分支返回的 vector

python - 如何将多个文件添加到py2app?

python - 无需帐户即可提取 Twitter 文本

python查询json对象路径

python - 按类别过滤 Pandas 数据框的最快方法

python - 我应该在 Python 3.x 的 if 语句中使用 'in' 还是 'or' 来根据多个值检查变量?

performance - unity3d 和 webgl 在性能和速度方面的比较

recursion - 为什么包含 Console.ReadLine() 的函数不完整?

python - 热图像处理

c# - 递归搜索目录中的文件