2
我们正在做一些实验来比较类和命名元组的访问时间,并观察奇怪的事情。为什么通过字段名访问namedtuple比访问类的成员变量慢?
import time
from collections import namedtuple as namedtuple
class myclass(object):
def __init__(self, _name, _dob, _value):
self.name = _name
self.dob = _dob
self.value = _value
randomperson1 = myclass('randomperson', 10102000, 10.45)
person = namedtuple('person', 'name dob value')
randomperson2 = person('randomperson', 10102000, 10.45)
在使用IPython中对于timeit,还观察到如下:
%timeit randomperson1.name,randomperson1.value,randomperson1.dob
10000000 loops, best of 3: 125 ns per loop
%timeit randomperson2.name,randomperson2.value,randomperson2.dob
1000000 loops, best of 3: 320 ns per loop
%timeit randomperson2[0],randomperson2[1],randomperson2[2]
10000000 loops, best of 3: 127 ns per loop
为什么的的字段名访问namedtuple比访问类的成员变量,以便慢得多?有什么办法可以加快速度吗?
由于'namedtuple'需要执行字段名称查找?我的意思是,它必须在Python代码中进行查找,而不是在类似成员的解释器中进行查找。 –
好的。这就说得通了。但是,如果一个namedtuple是不可变的,那么为什么应该动态完成这个查找?难道这不应该像一个班级那样完成吗? –