Python - 如何记忆部分对象?

Python - how do I memoize a partial object?

我有一组将整数和函数作为参数的函数。我想记住它们。

我知道使用 this solution,我可以使用 pickle 对两组参数进行编码并记住编码值。然而,在这个特定的用例中,函数参数很大且恒定,我宁愿不使用 lru_cache space 函数参数,在程序过程中 运行, 永不改变。

有没有办法让我记住一个部分函数,​​我已经修复了函数参数并收到了一个只接受可散列参数的部分对象?我不知道如何将 functools.lru_cache 装饰器用作函数。

这是我在玩具示例中尝试过的内容。它不起作用;二叉树仍然重新访问节点。

import functools
import logging


logging.basicConfig(level=logging.DEBUG)


def binomial_tree(x, y, fn):
    logging.debug(f"binomial_tree({x}, {y})")
    """Note: this does not recombine, and we can't memoize function."""
    if x == 10:
        return fn(x, y)
    else:
        return 0.5 * binomial_tree(x + 1, y, fn) + 0.5 * binomial_tree(x + 1, y + 1, fn)


def memoize_fn(fn):
    @functools.lru_cache(maxsize=None)
    def inner(*args, **kwargs):
        return fn(*args, **kwargs)
    return inner

memoized_binomial_tree = memoize_fn(functools.partial(binomial_tree, fn=lambda x, y: 10 * x * y))
print(memoized_binomial_tree(0, 0))

这是一种使用 binomial_tree 记忆玩具示例的方法,无需编码和记忆函数参数:

import functools
import logging


logging.basicConfig(level=logging.DEBUG)


def create_binomial_tree(fn):
    @functools.lru_cache(maxsize=None)
    def binomial_tree(x, y):
        logging.debug(f"binomial_tree({x}, {y})")
        if x == 10:
            return fn(x, y)
        else:
            return 0.5 * binomial_tree(x + 1, y) + 0.5 * binomial_tree(x + 1, y + 1)
    return binomial_tree


memoized_binomial_tree = create_binomial_tree(fn=lambda x, y: 10 * x * y)
print(memoized_binomial_tree(0, 0))

也许它可以适用于您的实际用例?