【问题标题】:@property speed overhead in Python [duplicate]Python中的@property速度开销[重复]
【发布时间】:2014-02-06 02:46:57
【问题描述】:

我正在尝试了解 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

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

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

我为每个创建一个实例:

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 次:每个循环 257 ns

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

很明显,@property 和 @setter 装饰器在你与对象交谈的频率很高的情况下效果较差。我的问题很简单,为什么要使用它?我很想听听人们可能拥有的这些装饰器的任何用例。谢谢。

【问题讨论】:

  • this old question 中讨论了使用属性的所有优点。正如您所发现的,这是以速度上的一些小损失为代价的。
  • 在不考虑可用性或灵活性或其他任何因素的情况下,通过花费额外几十纳秒的事实来衡量“劣质”是愚蠢的。很少需要对属性访问进行微优化。在访问不变属性 is 的极少数情况下,您通常希望将其复制到局部变量,并在循环内访问 that,所以它仍然不会不管属性访问有多快。如果你正在编写真正重要的代码,你可能不应该用 Python 编写它。

标签: python performance properties object-design


【解决方案1】:

简单的答案是您不会将propertys 用于基本属性。它们对于在存储或检索时需要额外逻辑的属性很有用。例如,具有从其他属性或需要错误检查或其他专门过滤的属性派生的值的属性。使用 propertys 可以让您在点菜中使用其他语言中常见的常见 setter/getter 模式,采用时尚而不是强制冗长的样板。

【讨论】:

    【解决方案2】:

    如果属性这么简单,不要使用property。你不需要它。 property 用于获取和设置属性需要做更多事情的情况,例如,如果涉及计算:

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

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

    【讨论】:

      猜你喜欢
      • 2011-03-09
      • 2016-06-10
      • 2013-05-24
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 2016-03-17
      • 2023-04-10
      相关资源
      最近更新 更多