今天当我在办公室检查了一些代码时,我发现了以下代码。这震惊了我。
class XXXX():
def __init__(self, k, v):
for i in range(len(k)):
setattr(self, k[i], v[i])
然后我发现大多数类都以相同的方式编写。这意味着所有类都是同一个类,唯一不同的是它们的名称。
在此项目中,setattr()
用于设置属性,getattr()
用于获取属性在配置文件日志setattr
中调用2700次,getattr
调用3800次。时间消耗分别为0.003秒和0.005秒(整个过程:0.069秒)。
虽然我认为setattr
和getattr
会降低速度,但我不确定是否重写了所有代码会使其更好。
obj.attribute = value的运行速度是否超过setattr(obj,'attribute',value)
?
答案 0 :(得分:1)
是的,getattr
和setattr
要慢得多,至少在CPU级别。
由于__init__
每个对象只调用一次,所以我不担心,除非你创建了很多很多对象。
如果多次访问对象的属性,则重写这些部分是值得的。不过,你应该首先仔细分析一下。
答案 1 :(得分:0)
我做了一个小测试。它大约慢了2倍。
Increment using member took 2.8221039772
Increment using attr took 5.94811701775
这是我的代码
import timeit
class Dummy(object):
__slots__ = ['testVal']
def __init__(self):
self.testVal = 0
def increment_using_attr(self):
i = getattr(self, 'testVal')
setattr(self, 'testVal', i+1)
def increment(self):
self.testVal += 1
if __name__ == '__main__':
d = Dummy()
print "Increment using member took {0}".format(timeit.Timer(d.increment).timeit(10000000))
print "Increment using attr took {0}".format(timeit.Timer(d.increment_using_attr).timeit(10000000))
在机器上运行Intel(R)Core(TM)2 Quad CPU Q9550 @ 2.83GHz