@Python中的属性速度开销

2024-09-27 20:17:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图理解Python中@property decorator的实用程序。具体来说,我使用如下属性设置一个类:

class A(object):
    def __init__(self, x):
        self._x = x

    @property
    def x(self):
        return self._x

    @x.setter
    def x(self, new_x):
        self._x = new_x

我还设置了一个没有提供相同功能的属性的类:

^{pr2}$

我为每种类型创建一个实例:

a = A(10)
b = B(10)

在iPython中运行%timeit会得到以下结果

%timeit a.x
%timeit b._x

1000000个循环,最多3:213个ns/环路

10000000个循环,最多3个:每个环路67.9 ns

%timeit a.x = 15
%timeit b._x = 15

1000000个环路,最好每个环路3:257ns

10000000个环路,最好是3个:每个环路89.7ns

很明显,@property和@setter修饰符都是低劣的,如果你要以显著的频率与对象交谈的话。我的问题很简单,为什么要用它?我很有兴趣听到人们可能拥有的这些装饰器的任何用例。谢谢。在


Tags: self实用程序newreturn属性objectinitdef
2条回答

如果属性如此简单,不要使用property。你不需要它。property当获取和设置一个属性需要做更多的工作时,例如,如果涉及计算:

@property
def area(self):
    return math.pi * self.radius**2

当以前简单的__dict__查找突然需要执行额外的工作时,它们特别有用。您可以切换到属性,而无需在每个调用位置添加方法调用括号。

简单的答案是,基本属性不使用propertys。它们对于存储或检索时需要附加逻辑的属性非常有用。例如,具有从其他属性派生的值的属性或需要进行错误检查或其他特殊筛选的属性。使用propertys可以使用其他语言中常见的通用setter/getter模式,而不是强制使用冗长的样板文件。

相关问题 更多 >

    热门问题