装饰师用python自己写,为什么函数名会影响程序的运行速度[关闭]

问题描述 投票:0回答:1

当我进行动态编程时,我使用装饰器来保存中间结果。当我自己实现装饰器时,我发现返回的函数的名称必须与传入的函数的名称相同,这样会更快,但是我不知道为什么。这样的代码,如果我写r = memo(r)和r(300)运行得非常快;但如果我写乐趣= memo(r)那么fun(300)运行缓慢。我想知道装饰器是如何工作的,谢谢。

def memo(func):
    coach={}
    def _w(n):
        if n in coach:
            result = coach[n]
        else:
            result = func(n)
            coach[n]=result
        return result
    return _w
def r(n):
    sub_price,sub_split =  max(
        [(price[n],n)]+[(r(i)+r(n-i),i) for i in range(1,n)],
        key = lambda x:x[0])
    if n not in solution:
        solution[n] = (sub_split,n-sub_split)
    #print(n,"  ",sub_split,"   ",n-sub_split,"   ",sub_price)
    return sub_price

r = memo(r)                            fun = memo(r)  
r(300)                                 fun(300)#very slow
# fast      
#this speed just like 
#@memo
#def r( )
python
1个回答
1
投票
fun = memo(r)  

这很慢,因为这里r仍然引用了函数的原始非memoized版本,因此当r调用自身时它不会通过查找表,因此你具有与没有memoization相同的复杂性。这里的memoization只会在你使用相同的参数多次调用fun时产生影响。 r的递归调用不受影响。

当你重新分配r时,这也会影响递归调用,所以你实际上改变了函数的复杂性。

© www.soinside.com 2019 - 2024. All rights reserved.