0

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

c_dict1, c_dict2,c_dict3

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

我有这个类的几百个实例,每个实例都有以下实例变量

i_key1, i_key2, i_key3, i_attr1, i_attr2,i_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*?显然,通过类变量来消除每个实例的三个指针,这可能会节省一些内存,但是这样做有没有显着的速度损失?

4

2 回答 2

4

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

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

我强烈怀疑这是过早的优化,并且您还没有将其识别为热点,因为如果您有,您可以双向分析您的代码,并且不会在这里询问。

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

于 2012-10-16T13:36:37.780 回答
0

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

如果您想与 保持c_dictN同步i_attrN,最好使用以下内容:

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

(请注意,如果它们真的像您的示例一样命名,您也可以使用setattrand将所有字段设置在一个循环中)。getattr

如果您可以按照上述方式进行操作,并且可以更改类的合同,则另一种解决方案是使用索引访问器,例如:

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
于 2012-10-16T13:31:05.663 回答