我的递归python代码中的瓶颈

时间:2017-10-21 15:35:55

标签: python algorithm recursion cyk

我使用递归来编写以下代码来执行CYK algorithm,以便语法G可以生成具有相同数量a的任何单词,后跟任意数量的b但是由于某种原因它很慢,不知道为什么?当我使用s2时它可以工作,但是如果我使用s1这是一个更长的字符串,它需要永远。任何人都可以建议,因为我无法弄清楚瓶颈在哪里?

def fn(G, w, i, j, T):
    if T[i, j]:
        print '1'
        return T[i, j]
    elif i == j:
        for r in G:
            print '2'
            if r.endswith(w[i]) and r[0] not in T[i, j]:    
                print '3'
                T[i, j].append(r[0])
    else:
        print '4'
        for k in range(i, j):
            print '5'
            for a in fn(G, w, i, k, T):
                print '6'
                for b in fn(G, w, k+1, j, T):
                    print '7'
                    for r in G:
                        print '8'
                        if r.endswith(a+b) and r[0] not in T[i, j]:
                            print '9'
                            T[i, j].append(r[0])
    return T[i, j]


def fnmain(G, S, w):
    dict = {}
    for x in range(0, len(w)):
        for y in range(x, len(w)):
            dict[x,y] = []
    print dict        
    v = fn(G, w, 0, len(w) - 1, dict)
    print (w, v)
    if S in v:
        print ("T")
        return True
    else:
        print ("F")
        return False

G = ["S->AB", "S->XB", "T->AB", "T->XB", "X->AT", "A->a", "B->b"]

s1 = "aaaaabbbbb"
s1 = "aaaaaaaaabbbbbbbbb"

fnmain(G, "S", s1)

我已经按照@wwii的建议使用了cProfile,结果如下:

当s1 =“aaaaabbbbb”时 enter image description here 当s1 =“aaaaaaaaabbbbbbbbb”时 enter image description here

0 个答案:

没有答案