【发布时间】: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