Python内存异常

Python内存异常,python,out-of-memory,Python,Out Of Memory,我编写了一个函数,可以通过一个表查找所有路径 #'X' is a full cell, ' ' is an empty cell test1 = [" X X XX ", " X XX X", " X X X X", " X X ", " X X "] def numAllPercs(table, numStreams): indeksiInVrsticeSplittani = [

我编写了一个函数,可以通过一个表查找所有路径

#'X' is a full cell, ' ' is an empty cell
test1 = ["  X  X XX ",
         " X   XX  X",
         " X X X   X",
         "     X X  ",
         "  X  X    "]

def numAllPercs(table, numStreams):
    indeksiInVrsticeSplittani = [map(lambda x,y:(x,y), sorted(range(0,len(table))*len(table[0])),range(0,len(table[0])) * len(table))[i:i+len(table[0])] for i in range(0,len(map(lambda x,y:(x,y), sorted(range(0,len(table))*len(table[0])),range(0,len(table[0])) * len(table))),len(table[0]))]

def Poti(tockaX,seznamPoti,table,vejitveniSeznam):
    if(tockaX[0]+1>=len(table) or table[tockaX[0]+1][tockaX[1]] == 'X') and (tockaX[1]+1>=len(table[0]) or table[tockaX[0]][tockaX[1]+1] == 'X') and (tockaX[1]-1<0 or table[tockaX[0]][tockaX[1]-1] == 'X') :
        return (seznamPoti if len(vejitveniSeznam)==0 else seznamPoti.append(vejitveniSeznam.pop()))

    if(tockaX[0]+1<len(table) and table[tockaX[0]+1][tockaX[1]] != 'X') and (tockaX[1]-1>=0 and table[tockaX[0]][tockaX[1]-1] != 'X') and (tockaX[1]+1<len(table[0]) and table[tockaX[0]][tockaX[1]+1] != 'X'):
        vejitveniSeznam.append(seznamPoti[-1])

    elif(tockaX[0]+1<len(table) and table[tockaX[0]+1][tockaX[1]] != 'X') and (tockaX[1]+1<len(table[0]) and table[tockaX[0]][tockaX[1]+1] != 'X'):
        vejitveniSeznam.append(seznamPoti[-1])

    elif(tockaX[1]+1<len(table[0]) and table[tockaX[0]][tockaX[1]+1] != 'X') and (tockaX[1]-1>=0 and table[tockaX[0]][tockaX[1]-1] != 'X'):
        vejitveniSeznam.append(seznamPoti[-1])

    elif(tockaX[0]+1<len(table) and table[tockaX[0]+1][tockaX[1]] != 'X') and (tockaX[1]-1>=0 and table[tockaX[0]][tockaX[1]-1] != 'X'):
        vejitveniSeznam.append(seznamPoti[-1])

    if(tockaX[0]+1<len(table) and table[tockaX[0]+1][tockaX[1]] != 'X'):
       seznamPoti.append(seznamPoti[len(seznamPoti)-1]+[indeksiInVrsticeSplittani[tockaX[0]+1][tockaX[1]]])
       Poti(indeksiInVrsticeSplittani[tockaX[0]+1][tockaX[1]],seznamPoti,table[:indeksiInVrsticeSplittani[tockaX[0]+1][tockaX[1]][0]] + [table[indeksiInVrsticeSplittani[tockaX[0]+1][tockaX[1]][0]][:indeksiInVrsticeSplittani[tockaX[0]+1][tockaX[1]][1]] + "X" + table[indeksiInVrsticeSplittani[tockaX[0]+1][tockaX[1]][0]][indeksiInVrsticeSplittani[tockaX[0]+1][tockaX[1]][1]+1:]] + table[indeksiInVrsticeSplittani[tockaX[0]+1][tockaX[1]][0]+1:],vejitveniSeznam)

    if(tockaX[1]+1<len(table[0]) and table[tockaX[0]][tockaX[1]+1] != 'X'):
        seznamPoti.append(seznamPoti[len(seznamPoti)-1]+[indeksiInVrsticeSplittani[tockaX[0]][tockaX[1]+1]])
        Poti(indeksiInVrsticeSplittani[tockaX[0]][tockaX[1]+1],seznamPoti,table[:indeksiInVrsticeSplittani[tockaX[0]][tockaX[1]+1][0]] + [table[indeksiInVrsticeSplittani[tockaX[0]][tockaX[1]+1][0]][:indeksiInVrsticeSplittani[tockaX[0]][tockaX[1]+1][1]] + "X" + table[indeksiInVrsticeSplittani[tockaX[0]][tockaX[1]+1][0]][indeksiInVrsticeSplittani[tockaX[0]][tockaX[1]+1][1]+1:]] + table[indeksiInVrsticeSplittani[tockaX[0]][tockaX[1]+1][0]+1:],vejitveniSeznam)

    if(tockaX[1]-1>=0 and table[tockaX[0]][tockaX[1]-1] != 'X'):
       seznamPoti.append(seznamPoti[len(seznamPoti)-1]+[indeksiInVrsticeSplittani[tockaX[0]][tockaX[1]-1]])
       Poti(indeksiInVrsticeSplittani[tockaX[0]][tockaX[1]-1],seznamPoti,table[:indeksiInVrsticeSplittani[tockaX[0]][tockaX[1]-1][0]] + [table[indeksiInVrsticeSplittani[tockaX[0]][tockaX[1]-1][0]][:indeksiInVrsticeSplittani[tockaX[0]][tockaX[1]-1][1]] + "X" + table[indeksiInVrsticeSplittani[tockaX[0]][tockaX[1]-1][0]][indeksiInVrsticeSplittani[tockaX[0]][tockaX[1]-1][1]+1:]] + table[indeksiInVrsticeSplittani[tockaX[0]][tockaX[1]-1][0]+1:],vejitveniSeznam)

    return seznamPoti

def resujem(table,seznami):
    vsePoti = filter(lambda x:x[-1][0]==len(table)-1,filter(lambda x:x[0][0]==0,reduce(lambda x,y:x+y,map(lambda x: Poti(x,[[x]],[table[0][:x[1]]+"X"+table[0][x[1]+1:]]+table[1:],[]),map(lambda x: (0,x), map(lambda x:x[1],filter(lambda x:x[0]==' ',map(lambda x,y: (x,y), map(lambda x: list(x), table)[0], range(0,len(table[0]))))))))))
    vsePoti.sort()

    def mojPresek(kombinacija):
        return (0 if len(set(reduce(lambda x,y:x+y,kombinacija))) != len(reduce(lambda x,y:x+y,kombinacija)) else 1)

    return (len(list(vsePoti for vsePoti,_ in itertools.groupby(vsePoti))) if (numStreams == 1) else  sum(map(lambda x:mojPresek(x),[list(x) for x in itertools.combinations(list(vsePoti for vsePoti,_ in itertools.groupby(vsePoti)), numStreams)])))

return (0 if numStreams <= 0 else
        0 if len(filter(lambda x: x == 'X'*len(table[0]),table)) != 0 else
        0 if numStreams >  len(map(lambda x:x[1],filter(lambda x:x[0]==' ',map(lambda x,y: (x,y), map(lambda x: list(x), table)[0], range(0,len(table[0])))))) else
        resujem(table,[]))
#'X'是一个满单元格,'是一个空单元格
test1=[“X X XX”,
“X XX X”,
“X X X”,
“X X”,
“X X”]
def numAllPercs(表,numStreams):
indeksiInVrsticeSplittani=[map(lambda x,y:(x,y)),排序(range(0,len(table))*len(table[0]),range(0,len(table[0])*len(table[0]),[i:i+len对于范围(0,len)(map(lambda x,y:(x,y)(x,y),排序(range(0,len(table))*len)(table[0]),range(0,len)(table[0])),len(table[0])),len(table[0]),len表[0]))]
def Poti(tockaX、seznamPoti、table、vejitveniSeznam):

如果(tockaX[0]+1>=len(表)或表[tockaX[0]+1][tockaX[1]]='X')和(tockaX[1]+1>=len(表[0])或表[tockaX[0]][tockaX[1]='X')和(tockaX[1]-1不。没有这样的解决方案。改变你的算法。好吧,如果你添加了足够的内存,也许会有。但是真的。你可以改变算法。如果这是个令人失望的消息,我深表哀悼。

哦,我的天哪……你知道你有一行460个字符的代码吗?而且缩进显然是错误的(函数外不能有返回语句)。我强烈建议您以更可读的方式重写该代码。因为现在它只是一团乱,我不想用我生命中的几个小时试图理解该代码。因此,请重写它,可能使用变量/函数的英文名称(否则,我们应该如何理解460个字符的作用?)是的,我同意你的观点,我为代码混乱表示歉意。我将尝试解释我的做法:对于表格第一行中的每个空单元格,我会找到表格中最低一行的所有组合。我通过递归地向下、向右或向左搜索路径,并填充我所在的单元格。教授告诉我,这个算法不是很有效(内存消耗),因为它会为每一个可能的移动创建一个新表。所以我想知道的是,有没有一种方法可以在不改变算法的情况下解决这个问题(因为我花了很多时间写这篇文章)?谢谢!那么问题是内存消耗呈指数增长(可能)。我可以问一下您使用的是哪个版本的python吗?因为我注意到您使用了大量的
过滤器
/
映射
等。所有这些都会在resursion树中创建列表,可能会占用大量空间。为了澄清,您正在尝试从顶部的X到底部的任何X?我想d从第一行的空单元格(用“”表示)到最后一行的空单元格的所有路径,只向下、向右或向左移动。你无法到达完整的单元格(用“X”表示)。这是一个令人失望的消息,因为我刚刚因为这项作业而未能通过本学年的考试:(谢谢你的努力和回答。毫无疑问,你会成为另一个领域的神童,最终给这位教授一份低收入的工作,因为他运气不好。