类变量查找与实例变量查找



>我有一个包含许多类变量的类:

c_dict1c_dict2c_dict3

它们都是字典,并使用下面的一些实例变量作为键来存储一些值。

我有数百个此类实例,每个实例都有以下实例变量

i_key1i_key2i_key3i_attr1i_attr2i_attr3

它们的前三个(i_key*)可以用来在类变量中查找后三个(i_attr*)。换句话说:

self.i_attr1 = MyClass.c_dict1(i_key1)
self.i_attr2 = MyClass.c_dict2(i_key2)
self.i_attr3 = MyClass.c_dict3(i_key3)

我的问题是:

在性能方面,我应该在本地维护实例变量i_attr*,还是应该使用类变量c_dict*通过字典查找来访问它们?显然,通过类变量执行每个实例可以消除三个指针,这可能会节省一些内存,但是这样做是否有任何显着的速度损失?

在性能方面,我应该在本地维护实例变量 i_attr*,还是应该使用类变量 c_dict* 通过字典查找来访问它们?

如果这种恒定时间的微优化很重要并且不为时过早,那么可能不要使用python。

我强烈怀疑这是过早的优化,你还没有把它确定为火锅,因为如果你有,你可以双向分析你的代码,不会在这里问。

您可以通过担心您的架构、是否应该运行可以利用 PyPi 的长期进程等来获得更多的加速。

就性能而言,您的问题没有通用答案,因为它取决于访问频率以及您如何使用结果,您只需要尝试看看。使用 timeitprofile 运行代码以查看结果。

如果要使c_dictNi_attrN保持同步,最好使用以下内容:

self.i_attrN = property(lambda self:       MyClass.c_dictN[i_keyN], 
                        lambda self, val:  MyClass.c_dictN[i_keyN] = val)

(请注意,您还可以使用 setattrgetattr 在循环中设置所有字段,如果它们确实像您的示例一样命名)。

如果你可以像上面那样做,并且可以更改类的协定,另一种解决方案是使用索引访问器,如下所示:

def __getitem__(self, idx):
    return MyClass.c_dict[idx][self.i_key[idx]]
def __setitem__(self, idx, val):
    MyClass.c_dict[idx][self.i_key[idx]] = val

然后,您可以将访问权限从

a = myobj.i_attrN
myobj.i_attrN = b

a = myobj[N]
myobj[N] = b

最新更新