Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-如何记忆部分对象?_Python_Memoization_Functools - Fatal编程技术网

Python-如何记忆部分对象?

Python-如何记忆部分对象?,python,memoization,functools,Python,Memoization,Functools,我有一组函数,将整数和函数作为参数。我想把它们记下来 我知道使用,我可以使用pickle对两组参数进行编码,并记忆编码的值。然而,在这个特定的用例中,函数参数是大的和恒定的,我不希望用一个函数参数占用lru\u缓存空间,因为在程序运行过程中,函数参数永远不会改变 有没有一种方法可以让我记忆一个部分函数,我已经修复了函数参数,并且收到了一个只接受哈希参数的部分对象?我不知道如何使用functools.lru\u cachedecorator作为函数 以下是我在一个玩具示例上尝试的内容。它不起作用;

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

我知道使用,我可以使用
pickle
对两组参数进行编码,并记忆编码的值。然而,在这个特定的用例中,函数参数是大的和恒定的,我不希望用一个函数参数占用
lru\u缓存
空间,因为在程序运行过程中,函数参数永远不会改变

有没有一种方法可以让我记忆一个部分函数,我已经修复了函数参数,并且收到了一个只接受哈希参数的部分对象?我不知道如何使用
functools.lru\u cache
decorator作为函数

以下是我在一个玩具示例上尝试的内容。它不起作用;二叉树仍然会重新访问节点

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))

下面是一种使用
二叉树
记忆玩具示例的方法,无需编码和记忆函数参数:

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))

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

这里的问题是,您对部分对象的记忆不会影响两个调用
二叉树(x+1,y,fn)
二叉树(x+1,y+1,fn)
。我想我只要记下二项式树就好了。但我不想在这个例子中这样做。函数参数在程序运行期间真的不会改变吗?这可能是一个愚蠢的问题,但是对于函数来说,使用分部变量而不是使用类或全局变量有什么意义呢?还是我把玩具的例子看得太严肃了?我想通过这个库从多个不同版本的
fn
中进行选择。但没错,改变一个全球经济体系是可行的。我只是不喜欢全局变量。好吧,我用闭包来模拟partial,但在两者之间插入缓存。这很有效。