【问题标题】:can i optimize this function even more我可以进一步优化这个功能吗
【发布时间】:2016-11-07 17:17:24
【问题描述】:

好吧,我正在寻找方法来优化我在 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:我相信我已经解决了问题?现在它不会拒绝两次访问同一地点的路径。

【问题讨论】:

  • 快速浏览一下,您的函数似乎都不正确。它确实if len(path) != len(set(path)): return,拒绝访问同一地点两次的所有路径,即使可能需要重新访问位置。
  • 我投票结束这个问题,因为它属于 CodeReview,而不是 StackOverflow。

标签: python optimization graph dynamic-programming


【解决方案1】:

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

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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 2011-07-15
    • 2011-10-30
    相关资源
    最近更新 更多