7

今天在办公室查了一些代码,发现如下代码。它震惊了我。

class XXXX():
    def __init__(self, k, v):
        for i in range(len(k)):
            setattr(self, k[i], v[i])

然后我发现大部分的类都是用同样的方式写的。这意味着所有的类都是同一个类,唯一不同的是他们的名字。

在这个项目setattr()中用于设置属性和getattr()用于获取属性在profile logsetattr中被调用了2700次,getattr被调用了3800次。耗时分别为 0.003 秒和 0.005 秒(整个过程:0.069 秒)。

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

obj.attribute = value 运行得比 快setattr(obj,'attribute',value)吗?

4

2 回答 2

3

是的,getattr而且setattr速度要慢得多,至少在 CPU 级别上是这样。

由于__init__每个对象只调用一次,除非您创建很多很多对象,否则我不会担心这一点。

如果对象的属性被多次访问,那么重写这些部分可能是值得的。不过,您应该先进行一些仔细的分析。

于 2012-10-11T19:21:06.590 回答
2

我做了一个小测试。它大约慢了 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

于 2016-12-13T19:47:04.960 回答