有条件的记忆?

Posted

技术标签:

【中文标题】有条件的记忆?【英文标题】:Conditional memoization? 【发布时间】:2013-11-05 03:19:07 【问题描述】:

那里有很多记忆装饰器,但我很好奇如何编写一个支持任意函数签名的记忆装饰器,但让函数决定何时记忆结果?像这样的:

def conditional_memoize(f):
    cache = 
    @wraps(f)
    def conditional_f(*args, **kwargs):
        return f(*args, **kwargs)
    return conditional_f

@conditional_memoize
def my_func(a, b, c):
    if str(a) + str(b) + str(c) in cache:
        return cache[str(a) + str(b) + str(c)]
    res = # compute the result
    if some_arbitrary_condition:
        cache[str(a) + str(b) + str(c)] = res
    return res

但是,由于NameError,我知道这不会起作用。无论如何,有没有聪明的方法来解决这个问题?我总是可以使用类方法和类缓存,只是想看看是否有装饰器模式。

【问题讨论】:

函数应该如何传达它是否希望缓存其结果? 【参考方案1】:

让函数返回它想要的结果和一个指示结果是否应该被缓存的标志,或者让包装器将缓存对象传递给函数。 (或两者兼而有之!)无论哪种方式都可以,但我更喜欢第一种方法。也许是这样的......

import functools

def conditional_memoize(fn):
    cache = 

    @functools.wraps(fn)
    def wrapper(*args, **kwargs):
        key = args + tuple(sorted(kwargs.iteritems()))
        if key in cache:
            return cache[key]
        result, flag = fn(*args, **kwargs)
        if flag:
            cache[key] = result
        return result

    return wrapper

【讨论】:

这有效地改变了修饰函数返回的结果——这意味着必须假设它们将被修饰。 当然。当然,这不一定是问题;有很多装饰器需要这样的假设。 这个假设非常有效。将缓存对象传递给函数也可以。我希望我有某种谓词逻辑。我希望我在写 Prolog。

以上是关于有条件的记忆?的主要内容,如果未能解决你的问题,请参考以下文章

个人感悟:论自然语言与条件反射

数位dp-基础

左连接和右连接的理解?

逻辑运算符

855E

自动生成默认/复制/移动 ctor 和复制/移动赋值运算符的条件?