setattr()和getattr()会大大减慢速度吗?

时间:2012-10-09 11:02:43

标签: python-3.x

今天当我在办公室检查了一些代码时,我发现了以下代码。这震惊了我。

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秒)。

虽然我认为setattrgetattr会降低速度,但我不确定是否重写了所有代码会使其更好。

obj.attribute = value的运行速度是否超过setattr(obj,'attribute',value)

2 个答案:

答案 0 :(得分:1)

是的,getattrsetattr要慢得多,至少在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