先舉一個很簡單的例子, 一個函數(shù)接收兩個參數(shù)絮记,返回這兩個參數(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()
我們對1和2虐先,3和4分別進(jìn)行了兩次計算怨愤,那么add
函數(shù)每次都會進(jìn)行計算,然后返回值蛹批,如果可以發(fā)現(xiàn)1和2被計算過了撰洗,以后再調(diào)用1和2求和的話,能直接使用計算好的值是最好的腐芍,而不用重新計算(如果計算過程復(fù)雜耗時較長的情況下差导,這是非常有用的方式,這里只是簡單的進(jìn)行了求和計算甸赃,計算量較少)果录。
看一下我們的改進(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()
我們對add
函數(shù)增加了一個字典參數(shù)锻拘,大家都知道寄锐,任何調(diào)用如果對這個字典進(jìn)行了修改汹碱,這個字典會一直有效的。
比如第一次調(diào)用add(1, 2)
的時候:
if (a, b) in __cache:
return __cache[(a, b)]
(a, b)
也就是1和2組成的元組這個key不存在于字典__cache
中项玛,那么會執(zhí)行后面的計算貌笨,并且把計算結(jié)果以字典的方式存在__cache
中,其中key是參數(shù)組成的元組襟沮,value是計算后的值锥惋,然后返回計算后的值,同理3和4的計算類似开伏,那下一次再遇見add(1, 2)
的時候:
if (a, b) in __cache:
return __cache[(a, b)]
發(fā)現(xiàn)(a, b)
是存在于__cache
中的膀跌,我們直接返回已經(jīng)計算好的值即可,而不用重新計算(如果計算量較大固灵,這會非常好用)捅伤。