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)
这是一种无需编码和记忆函数参数即可记忆玩具示例的方法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)
也许它可以适用于您的实际用例?
| 归档时间: |
|
| 查看次数: |
820 次 |
| 最近记录: |