0

いくつかのクラス変数を含むクラスがあります:

c_dict1c_dict2c_dict3

それらはすべて辞書であり、以下のインスタンス変数のいくつかをキーとして使用していくつかの値を格納します。

このクラスのインスタンスが数百あり、それぞれに次のインスタンス変数あります。

i_key1、、、、、、i_key2_ i_key3_ i_attr1_ i_attr2_i_attr3

最初の 3 つ ( ) を使用して、クラス変数でi_key*後の 3 つ ( ) を検索できます。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*か? 明らかに、クラス変数を介して実行すると、インスタンスごとに 3 つのポインターが削除されるため、メモリが節約される可能性がありますが、この方法で実行すると速度が大幅に低下することはありますか?

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)

(例のように実際に名前が付けられている場合は、ループ内のすべてのフィールドを使用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
于 2012-10-16T13:31:05.663 に答える