gpt4 book ai didi

Python - 如何记住部分对象?

转载 作者:行者123 更新时间:2023-11-28 16:56:25 25 4
gpt4 key购买 nike

我有一组将整数和函数作为参数的函数。我想记住它们。

我知道使用 this solution ,我可以使用 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))

最佳答案

这是一种使用 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))

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

关于Python - 如何记住部分对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57935329/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com