Python中的@property速度开销

pau*_*aul 5 python performance properties object-design

我正在尝试了解Python中@property装饰器的实用程序。具体来说,我使用如下属性设置了一个类:

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
Run Code Online (Sandbox Code Playgroud)

而且我还建立了一个没有提供相同功能的属性的类:

class B(object):
    def __init__(self, x):
        self._x = x
Run Code Online (Sandbox Code Playgroud)

我创建每个实例:

a = A(10)
b = B(10)
Run Code Online (Sandbox Code Playgroud)

在iPython中运行%timeit会产生以下结果

%timeit a.x
%timeit b._x
Run Code Online (Sandbox Code Playgroud)

1000000次循环,每循环3:213 ns的最佳时间

10000000次循环,最佳3:每个循环67.9 ns

%timeit a.x = 15
%timeit b._x = 15
Run Code Online (Sandbox Code Playgroud)

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

10000000次循环,每循环3:89.7 ns最佳

显然,如果您要以很高的频率与该对象交谈,则@property和@setter装饰器会逊色。我的问题就是,为什么要使用它?我想听听人们可能拥有的这些装饰器的用例。谢谢。

Sil*_*Ray 6

简单的答案是您不使用propertys 来表示基本属性。它们对于存储或检索时需要额外逻辑的属性非常有用。例如,具有从其他属性派生的值的属性或需要错误检查或其他专门过滤的属性。使用propertys 可以让您按菜单使用其他语言中常见的通用 setter/getter 模式,随心所欲,而不是强制使用冗长的样板文件。