![](/img/trans.png)
[英]Class variables are unable to perform attribute lookup upon the instance variable
[英]Class variables lookup vs instance variables lookup
我有一個包含許多類變量的類 :
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.