簡體   English   中英

類變量查找與實例變量查找

[英]Class variables lookup vs instance variables lookup

我有一個包含許多類變量

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM