使用裝飾器為Python函式做快取

2021-06-12 06:52:42 字數 964 閱讀 1041

寫了個函式作為裝飾器為fibonacci數列做快取,做了一下效能比較。

#!/usr/bin/python

# coding: utf-8

import datetime

now = datetime.datetime.now

from functools import wraps

def cache(func):

caches = {}

@wraps(func)

def wrap(*args):

if args not in caches:

caches[args] = func(*args)

return caches[args]

return wrap

def fib(num):

if num < 2:

return 1

return fib(num-1) + fib(num-2)

fib_with_cache = cache(fib)

start = now()

for i in range(10):

fib(30)

end = now()

print "fib without cache costs: %r" % (end - start)

start = now()

for i in range(10):

fib_with_cache(30)

end = now()

print "fib with cache costs: %r" % (end - start)

輸出結果:

fib without cache costs: datetime.timedelta(0, 6, 219000)

fib with cache costs: datetime.timedelta(0, 0, 672000)

python裝飾器 如何使用函式裝飾器

問題舉例 有時候我們想為多個函式統一新增某種功能,比如計時統計 記錄日誌,快取運算結果等 我們並不想在每個函式內一一新增完全相同的 有什麼解決方案嗎?定義裝飾器函式,用它在原函式的基礎上生成乙個新增新功能的函式來代替原函式 def memo func cache def wrap args res ...

函式作裝飾器 ,類做裝飾器

用類寫裝飾器 func decorator func func abc 18 class decorator object def init self,f self.f f def call self,args,kwargs print decorator start self.f args,kwa...

python 裝飾器做快取

裝飾器在之前的文章中有講過,這裡主要是說了裝飾器的用法和應該怎麼理解。這片文章給出一片補充 主要說在快取方面的應用。在此之前呢,需要補充一些知識點 就是 python 查詢變數的順序是什麼?答案就是legb原則 也就是 local enclosed global built in 也就是先在區域性作...