我需要一个备忘录装饰器,它可以:
- 备忘实例方法的参数和关键字参数
- 具有可通过一次调用清除(全局)缓存的缓存(与此使用每个函数缓存的缓存不同: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 = {}
我觉得它的问题在于缓存部分似乎有很多开销(例如对于递归函数)。以以下函数为例,我可以使用非记忆化版本 10 次调用 fib(30),所需时间比记忆化版本少。
def fib(n):
if n in (0, 1):
return n
return fib(n-1) + fib(n-2)
有没有人能够建议一种更好的编写装饰器的方法?(或指向一个更好(即更快)的装饰器来完成我想要的功能)。
我不感兴趣保留方法签名,也不希望帮助内省工具“了解”被装饰函数的任何信息。
谢谢。
P.S. 使用的是Python 2.7