Pau*_*jan 12 python performance properties
我编写了一些使用对象属性的代码:
class Foo:
def __init__(self):
self.bar = "baz"
myFoo = Foo()
print (myFoo.bar)
Run Code Online (Sandbox Code Playgroud)
现在我想做一些花哨的计算来回归bar.我可以使用@property方法作为属性bar,或者我可以重构我的代码使用myFoo.bar().
我应该回去为我的所有bar访问添加parens 还是使用@property?假设我的代码库现在很小但是由于熵会增加.
Vin*_*jip 21
如果它在逻辑上是对象的属性/属性,我会说将它保留为属性.如果它可能变得参数化,我的意思是你可能想要调用myFoo.bar(someArgs)然后咬住子弹并使它成为一种方法.
在大多数情况下,性能不太可能成为问题.
Ale*_*lli 19
当它很容易测量时,想知道性能是不必要的:
$ python -mtimeit -s'class X(object):
> @property
> def y(self): return 23
> x=X()' 'x.y'
1000000 loops, best of 3: 0.685 usec per loop
$ python -mtimeit -s'class X(object):
def y(self): return 23
x=X()' 'x.y()'
1000000 loops, best of 3: 0.447 usec per loop
$
Run Code Online (Sandbox Code Playgroud)
(在我的慢速笔记本电脑上 - 如果你想知道为什么第二个案例没有辅助shell提示,那是因为我是从第一个用bash中的向上箭头构建的,并且重复了换行结构而不是提示! - ).
因此,除非你知道200+纳秒左右的重要事项(一个紧密的内循环,你试图最大限度地优化),你可以负担得起使用属性方法; 如果你做一些计算来得到这个值,那么200+纳秒当然会占总时间的一小部分.
我同意其他的答案,如果计算变得太重,或者你可能想要参数等,一个方法是可取的 - 同样,我会补充说,如果你需要在某处隐藏可调用的但只是稍后调用它和其他花哨的函数式编程技巧; 但我想定量地提高性能,因为timeit这样的测量非常简单! - )
在这样的情况下,我发现选择最有意义的选项要好得多.如果存在这些差异,您将不会获得任何明显的性能损失.您的代码易于使用和维护更为重要.
至于在使用方法和a之间进行选择@property,这是一个品味问题,但由于属性将自己伪装成简单的属性,因此不应该进行任何详细的讨论.方法表明它可能是一个昂贵的操作,使用您的代码的开发人员将考虑缓存该值而不是一次又一次地获取它.
所以,再次,不要继续表现,始终考虑可维护性与性能.随着时间的推移,计算机变得越来越快.这同样不代表代码的可读性.
总之,如果你想得到一个简单的计算值,@property是一个很好的选择; 如果你想要一个精心计算的值,一个方法表明更好.