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,但在两者之间插入缓存。这很有效。