>我有一个包含许多类变量的类:
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*
通过字典查找来访问它们?显然,通过类变量执行每个实例可以消除三个指针,这可能会节省一些内存,但是这样做是否有任何显着的速度损失?
在性能方面,我应该在本地维护实例变量 i_attr*,还是应该使用类变量 c_dict* 通过字典查找来访问它们?
如果这种恒定时间的微优化很重要并且不为时过早,那么可能不要使用python。
我强烈怀疑这是过早的优化,你还没有把它确定为火锅,因为如果你有,你可以双向分析你的代码,不会在这里问。
您可以通过担心您的架构、是否应该运行可以利用 PyPi 的长期进程等来获得更多的加速。
就性能而言,您的问题没有通用答案,因为它取决于访问频率以及您如何使用结果,您只需要尝试看看。使用 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)
(请注意,您还可以使用 setattr
和 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