我要的是一個記憶化裝飾器:可以做些什麼來加速這個memoization裝飾器?
- 可以memoize的實例方法有兩個參數和關鍵字參數
- 具有可與一個呼叫被清除(全局)高速緩存(這與一個使用每個功能的緩存:python resettable instance method memoization decorator)
- 是合理有效
我已經調整了我看到了一個例子,有以下想出了:
import functools
class Memoized(object):
"""Decorator that caches a function's return value each time it is called.
If called later with the same arguments, the cached value is returned, and
not re-evaluated.
"""
__cache = {}
def __init__(self, func):
self.func = func
self.key = (func.__module__, func.__name__)
def __call__(self, *args):
try:
return Memoized.__cache[self.key][args]
except KeyError:
value = self.func(*args)
Memoized.__cache[self.key] = {args : value}
return value
except TypeError:
# uncachable -- for instance, passing a list as an argument.
# Better to not cache than to blow up entirely.
return self.func(*args)
def __get__(self, obj, objtype):
"""Support instance methods."""
return functools.partial(self.__call__, obj)
@staticmethod
def reset():
Memoized.__cache = {}
我與它的問題是,緩存部分似乎涉及大量的開銷(例如:遞歸函數)。以下面的函數爲例,我可以在比memoized版本更少的時間內用非memoized版本調用fib(30)十次。
def fib(n):
if n in (0, 1):
return n
return fib(n-1) + fib(n-2)
任何人都可以提出一個更好的方式來寫這個裝飾? (或者將我指向一個更好的(即更快的)裝飾器,它可以做我想做的)。 我對保留方法簽名不感興趣,或幫助內省工具「知道」關於裝飾函數的任何內容。
謝謝。
P.S.使用Python 2.7
哦。麻煩,你說得對。我應該注意到這一點。 :-)我的版本仍然會更快,但幾乎沒有這麼多。 – Omnifarious 2011-02-07 22:43:51