【问题标题】:Python set more properties with 1 callPython 通过 1 次调用设置更多属性
【发布时间】:2018-09-25 12:26:06
【问题描述】:

我有一个非常昂贵的方法,它返回 2 个值,它被 A 类调用。由于它很昂贵,我使用属性对 2 个值进行了惰性评估。由于我不想调用very_expensive_function 2 次,所以当用户第一次想要访问这两个值中的一个时,我将两者都保存了。

到目前为止,我写了这个:

class A:
    def __init__(self):
        self._attr1 = None
        self._attr2 = None

    @property
    def attr1(self):
        self.calculate_metrics()
        return self._attr1


    @property
    def attr2(self):
        self.calculate_metrics()
        return self._attr2

    def calculate_metrics():
        if self._attr1 is None:
            attr1, attr2 = very_expensive_call()
            self._attr1 = attr1
            self._attr2 = attr2

如您所见,用户第一次访问attr1attr2,我都保存了。它是正确的还是可能以其他方式?每次都复制粘贴calculate_metrics() 似乎很奇怪。

【问题讨论】:

  • 据我所知,这是这样做的方法。
  • 有没有参数传递给very_expensive_call?如果有,您也许可以使用 memoization。
  • 感谢您的回答!是的,有参数,“我可以使用记忆”是什么意思?
  • 我会添加一个答案。

标签: python python-3.x properties


【解决方案1】:

简单地说,记忆就是记住你是否已经用特定的参数调用了一个函数。如果你有它只是返回已经计算的返回值而不是再次计算它。

import time
def long_calculation(x, y, memo={}):
    try:
        result = memo[x, y] # already calculated!
    except KeyError:
        # make long_calculation take a long time!
        time.sleep(2)
        result = x * y
        memo[x, y] = result
    return result

字典memo 能够记住对函数的调用,因为它在函数首次加载时进行评估:对long_calculation 的每次调用都共享同一个memo 字典。

要测试这个尝试:

# Note that (2,2) (7,8) and (10,10) are repeated here:
test_values = ((2,2),(4,5),(2,2),(7,8),(2,3),(7,8),(10,11),(4,5),(10,10),(10,10))

for values in test_values:
    start = time.time()
    res = long_calculation(*values)
    end = time.time()
    elapsed = end-start
    print(values,' calculated in ',elapsed, "seconds")

将这种代码插入到你的类中应该是相当容易的。如果您总是需要计算属性,那么您可以拨打电话__init__

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多