gpt4 book ai didi

python - 类成员函数的 Memoize 包装器返回部分值

转载 作者:行者123 更新时间:2023-12-01 04:49:46 28 4
gpt4 key购买 nike

我正在使用 here 中的 memoize 配方并对返回 2 个值的函数进行了稍微修改。我使用此包装器创建两个单独的函数,分别返回第一个和第二个值,但函数计算会被缓存,以便使用相同参数调用任一返回函数时不会产生任何开销。这是这个包装器的代码。

def memoize(obj, cache_limit=10):
'''
This function caches the return value each time it is called. partial() is used to return the appropriate value.
Cache size is limited to 10
See here for details on this design pattern: https://wiki.python.org/moin/PythonDecoratorLibrary#Memoize
'''
cache = obj.cache = {}
key_cache = collections.deque()

@functools.wraps(obj)
def memoizer(which, *args, **kwargs):
key = str(args)
if key not in cache:
cache[key] = obj(*args, **kwargs)
key_cache.append(key)
if len(key_cache) >= cache_limit:
del cache[key_cache.popleft()]
return cache[key][which]
return functools.partial(memoizer, 0), functools.partial(memoizer, 1)

现在,我尝试在以这种方式在类中定义的函数 f 上使用它:

class test_function:
def __init__(self):
''''''

def f(self,x):
return 2*x, 3*x

我这样调用它

a = test_function()
f_v1, f_v2 = memoize(a.f)

如果成功,f_v1(x) 将返回 2xf_v2(x) 将返回 3x。但这失败并出现错误:

AttributeError: 'instancemethod' object has no attribute 'cache'

如果函数是在类之外声明的,我的代码可以正常工作。我缺少什么?我正在使用 Python 2.7

最佳答案

方法是一种与函数不同的对象(如错误消息所示,是一个 instancemethod 对象;此类型可用作 types.MethodType)。与函数对象不同,实例方法没有 __dict__,因此您不能在它们上设置任意属性;您无法通过 obj.someMethod.someAttribute = "blah" 在方法上创建名为 someAttribute 的自定义属性。

我不清楚为什么你要把缓存存储在对象上,因为你从来没有真正从那里访问它。如果您只使用局部变量cache,它将被保存在闭包中并且可以正常工作:

def memoize(obj, cache_limit=10):
'''
This function caches the return value each time it is called. partial() is used to return the appropriate value.
Cache size is limited to 10
See here for details on this design pattern: https://wiki.python.org/moin/PythonDecoratorLibrary#Memoize
'''
cache = {}
key_cache = collections.deque()

@functools.wraps(obj)
def memoizer(which, *args, **kwargs):
key = str(args)
if key not in cache:
cache[key] = obj(*args, **kwargs)
key_cache.append(key)
if len(key_cache) >= cache_limit:
del cache[key_cache.popleft()]
return cache[key][which]
return functools.partial(memoizer, 0), functools.partial(memoizer, 1)

>>> a = test_function()
... f_v1, f_v2 = memoize(a.f)
>>> f_v1(2)
4
>>> f_v2(2)
6

关于python - 类成员函数的 Memoize 包装器返回部分值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28704314/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com