我可以优化该功能更加

问题描述:

好,我正在寻找方法来优化,我在Python写的是回答这个问题的函数:我可以优化该功能更加

“考虑到整数的方阵包含的每一行按顺序到达开始,第一个人,第二个人,...最后一个人和退出所需的时间,行的顺序遵循相同的模式(开始,每个人,出口)。可以重新访问不同的地点,并且移动到出口并不意味着您必须立即离开 - 如果时间允许,可以在出口处移动以从其中移出并拾取更多人员。有些路径将时间加回到时钟增加时间将延迟关闭出口门,如果时间回到0或正数af如果门已经关闭,它会触发出口重新打开。因此,有可能走一圈并持续获得时间:也就是说,每次遍历路径时,都会使用或添加相同的时间量。

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

是我写的功能是:

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微秒到180微秒。

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

+1

从快看,你的函数没有按”甚至似乎是正确的。它会'如果len(path)!= len(set(path)):return',拒绝所有访问同一地点两次的路径,即使可能需要重新访问位置。 – user2357112

+0

我投票结束这个问题作为离题,因为它属于CodeReview,而不是StackOverflow。 – Prune

我不要试图完全理解你的代码,但如果你改变这些线

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]