我可以进一步优化这个功能吗?

时间:2016-11-07 17:17:24

标签: python optimization graph dynamic-programming

好吧,我正在寻找方法来优化我在python中作为这个问题的答案编写的函数:

“给定一个整数的矩形矩阵,每行包含到达开始所需的时间,第一个人,第二个人,......,最后一个人,以及该顺序的出口。行的顺序如下相同的模式(开始,每个人,退出)。提醒人们是即时的,可以重新访问不同的地点,并且移动到出口并不意味着你必须立即离开 - 它可以往返出口如果时间允许,可以接收额外的人员。一些路径会将时间添加到时钟。增加时钟的时间将延迟关闭出口门,如果时间回到0或门已经有正数关闭,它会触发退出以重新打开。因此,可能会走一圈并继续获得时间:也就是说,每次遍历路径时,都会使用或添加相同的时间。

目标是编写一个函数来计算大多数人可以拿起的人和他们是谁,同时在门关闭之前仍然通过出口逃脱。函数应返回返回已保存人员的索引排序顺序。 “

我写的功能是:

def answer(times,time_limit):   
    mindic=min(min(times))
    n=len(times)
    def find_path(times, start, end,time, path=[]):
        if start != 0 and start != end :
            if start-1 in path:
                pass
            else:
                path = path + [start-1]
        if start == end and time-min(times[start][0:len(times[start])-1]) < mindic:
            return path
        best=None
        for i in range(n):
            if time-times[start][i] >= mindic and times[start][i] != 0 :
                newpath = find_path(times, i, end,time-times[start][i], path)
                if newpath != None :   
                    if not best or len(newpath) > len(best):
                        best=newpath
        return best
    res=find_path(times,0,n-1,time_limit)
    return res

调用该函数将是这样的:

answer([[0, 1, 1, 1, 1], [1, 0, 1, 1, 1], [1, 1, 0, 1, 1], [1, 1, 1, 0, 1], [1, 1, 1, 1, 0]],3)

以上例子的答案是:

[0, 1]

它只能保存索引为0且索引为1的人。

使用'%% timeit 10'运行该函数给出以下内容:

1000 loops, best of 3: 180 µs per loop

有没有办法减少时间?

编辑:谢谢@quantummind,从221μs到180μs得到它。

EDIT2 :@ user2357112:我相信我修复了这个问题?现在它不会拒绝两次访问同一地点的路径。

1 个答案:

答案 0 :(得分:0)

我没有尝试完全理解您的代码,但如果您更改这些代码行可能会有所帮助

    if start != 0 and start != end :
        path = path + [start-1]
    if len(path) != len(set(path)):
        return

这样:

    if start != 0 and start != end :
        if start-1 in path:
            return
        path = path + [start-1]