gpt4 book ai didi

python - 如何有效地使用 Python 属性?

转载 作者:太空狗 更新时间:2023-10-29 21:41:41 25 4
gpt4 key购买 nike

假设我有一个存储一些统计数据的类 Foo,我想使用 Python 属性封装对这些数据的访问。这特别有用,例如,当我只存储变量的方差并想访问其标准差时:在这种情况下,我可以定义属性 Foo.std 并使其返回方差的平方根。

这种方法的问题是,如果我需要多次访问Foo.std,我每次都会计算平方根;此外,由于属性的表示法与属性的表示法完全相同,我的类的用户可能不知道每次访问属性时都在进行计算。

此示例中的另一种方法是在每次更新方差时计算标准差,并将其设置为属性。但是,如果我不需要在每次更新时访问它,那将是低效的。

我的问题是:当您需要执行昂贵的计算时,有效使用 Python 属性的最佳方法是什么?我应该在第一次调用后缓存结果并在更新时删除缓存吗?或者我应该不使用属性而使用方法 Foo.get_std() 代替?

最佳答案

通常您可以通过缓存 来做到这一点。例如你可以这样写:

class Foo:

def __int__(self, also, other, arguments):
# ...
<b>self._std = None</b>

@property
def std(self):
<b>if self._std is None:
# ... calculate standard deviation
self._std = ...
return self._std</b>

def alter_state(self, some, arguments):
# update state
<b>self._std = None</b>

所以这里我们有一个属性 std 还有一个属性 _std。如果尚未计算标准偏差,或者您更改对象状态使得标准偏差可能已更改,我们将 _std 设置为 None。现在,如果我们访问 .std,我们首先检查 _std 是否为 None。如果是这种情况,我们计算标准差并将其存储到 _std 中并返回。这样 - 如果对象未更改 - 我们稍后可以简单地检索它。

如果我们改变对象使得标准偏差可能发生变化,我们将 _std 设置回 None,以在我们访问 时强制重新评估.std 再次。

如果我们在重新计算标准偏差之前两次更改 Foo 对象的状态,我们只会重新计算一次。因此,您可以经常更改 Foo 对象,(几乎)不涉及额外成本(除了将 self._std 设置为 None)。因此,如果您有一个庞大的数据集并对其进行了广泛更新,您只会在真正需要时才重新计算标准差。

此外,这也可以成为更新统计措施的机会,以防(非常)便宜。例如,假设您有一个经常批量更新的对象列表。如果您使用一个常数递增所有元素,则均值 也将随着该常数递增。因此,更改状态以便某些指标也可以轻松更改的函数可能会更新指标,而不是使这些 None

请注意,.std 是属性还是函数是无关紧要的。用户不必知道必须多久计算一次。 std() 函数将保证一旦计算完成,第二次检索将非常快。

关于python - 如何有效地使用 Python 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47232902/

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