先舉一個(gè)很簡(jiǎn)單的例子, 一個(gè)函數(shù)接收兩個(gè)參數(shù),返回這兩個(gè)參數(shù)的和。
def add(a, b):
return a + b
def main():
print(add(1, 2))
print(add(3, 4))
print(add(1, 2))
print(add(3, 4))
if __name__ == '__main__':
main()
我們對(duì)1和2,3和4分別進(jìn)行了兩次計(jì)算,那么add函數(shù)每次都會(huì)進(jìn)行計(jì)算,然后返回值,如果可以發(fā)現(xiàn)1和2被計(jì)算過(guò)了,以后再調(diào)用1和2求和的話,能直接使用計(jì)算好的值是最好的,而不用重新計(jì)算(如果計(jì)算過(guò)程復(fù)雜耗時(shí)較長(zhǎng)的情況下,這是非常有用的方式,這里只是簡(jiǎn)單的進(jìn)行了求和計(jì)算,計(jì)算量較少)。
看一下我們的改進(jìn)方式:
def add(a, b, __cache={}):
if (a, b) in __cache:
return __cache[(a, b)]
ret = a + b
__cache[(a, b)] = ret
return ret
def main():
print(add(1, 2))
print(add(3, 4))
print(add(1, 2))
print(add(3, 4))
if __name__ == '__main__':
main()
我們對(duì)add函數(shù)增加了一個(gè)字典參數(shù),大家都知道,任何調(diào)用如果對(duì)這個(gè)字典進(jìn)行了修改,這個(gè)字典會(huì)一直有效的。
比如第一次調(diào)用add(1, 2)的時(shí)候:
if (a, b) in __cache:
return __cache[(a, b)]
(a, b)也就是1和2組成的元組這個(gè)key不存在于字典__cache中,那么會(huì)執(zhí)行后面的計(jì)算,并且把計(jì)算結(jié)果以字典的方式存在__cache中,其中key是參數(shù)組成的元組,value是計(jì)算后的值,然后返回計(jì)算后的值,同理3和4的計(jì)算類似,那下一次再遇見(jiàn)add(1, 2)的時(shí)候:
if (a, b) in __cache:
return __cache[(a, b)]
發(fā)現(xiàn)(a, b)是存在于__cache中的,我們直接返回已經(jīng)計(jì)算好的值即可,而不用重新計(jì)算(如果計(jì)算量較大,這會(huì)非常好用)。