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))
也许它可以适用于您的实际用例?
我有一组将整数和函数作为参数的函数。我想记住它们。
我知道使用 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))
也许它可以适用于您的实际用例?