Python - 如何记忆部分对象?

Mik*_*and 5 python memoization functools

我有一组以整数和函数作为参数的函数。我想把它们记下来。

我知道使用这个解决方案,我可以pickle对两组参数进行编码并记住编码值。然而,在这个特定的用例中,函数参数很大且恒定,我不想用lru_cache在程序运行过程中永远不会改变的函数参数占用空间。

有没有一种方法可以让我记住部分函数,​​其中我已经修复了函数参数并收到了仅采用可哈希参数的部分对象?我不知道如何将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))
Run Code Online (Sandbox Code Playgroud)

san*_*ash 4

这是一种无需编码和记忆函数参数即可记忆玩具示例的方法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))
Run Code Online (Sandbox Code Playgroud)

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