2017-02-18 2 views
0

特定のクラスの各インスタンスには独自の辞書があります。これは、多数の同じように構造化されたクラスオブジェクトが存在する場合に、多くのスペースを無駄にする可能性があります。これは実際のケースか、基礎となるメカニズムがより効率的であるかどうか、明示的に要求された場合にのみオブジェクトの辞書を作成することです。 私は、クラスを使用するのを避け、代わりに名前付き定数を持つシーケンスをインデックスとして使用すると、非常に多数の、おそらく数百万のオブジェクトを持つアプリケーションを検討していますか?クラスオブジェクトのデータ効率

+1

百万は非常に多くありません:

class Person(object): __slots__ = ['firstname', 'lastname'] def __init__(self, firstname, lastname): self.firstname = firstname self.lastname = lastname def __repr__(self): return '{self.__class__.__name__}({self.firstname!r}, {self.lastname!r})'.format(self=self) >>> p = Person('Tom', 'Riddle') >>> p Person('Tom', 'Riddle') >>> p.firstname 'Tom' 

またはnamedtupleとして:

は、例えば、ちょうど2つの属性「姓」と「FIRSTNAME」を持つクラスは、として実装することができ'__slots__'をチェックアウトする必要があります。たとえば、ここでは:http://stackoverflow.com/questions/472000/usage-of-slots –

+0

@Paul Hankin答えがあったはずですが、私はそれを上回る可能性があります。正確に私が探していた答えです。 –

+0

__slots__変数に指定された要素にしかアクセスできないため、入力エラーが早期に検出されるという利点があります。これは本当にPythonのドキュメントではるかに目立つはずです。 –

答えて

1

オーバーヘッドを減らしたい場合は、実際に必要なものに応じて2つのオプションがあります。

クラスのような構造が必要な場合は、__slots__の使用を検討する必要があります。これにより、__dict__は回避されますが、メソッドやプロパティなどを持つことができます。あなたは動的に属性を追加する能力を失います(あなたは__slots__としてリストされているものに制限されています)。

オブジェクトの「記憶域」を必要とし、メソッドや同様の方法が不要な場合は、collections.namedtupleを使用できます。これらのアイテムは、クラスに似たインターフェースを提供し、空間効率がかなり良いはずです。 、

>>> from collections import namedtuple 

>>> Person = namedtuple('Person', 'firstname, lastname') 

>>> p = Person('Tom', 'Riddle') 
>>> p 
Person(firstname='Tom', lastname='Riddle') 
>>> p.firstname 
'Tom' 
+0

動的にメンバーを追加することができないというのは、私の意見ではより多くのメリットがあります。私はnamedtupleについて知らなかったし、そうでなければそれを良い解決策と考えていただろうが、__slots__は優れているようだ。 –

+0

@ChrisBarry両方ともユースケースを持っています。私は '__slots__'が優れていることに同意しています(メソッドと実際のプロパティを許可します)が、場合によっては"クラスのような "不変のストレージコンテナが必要なだけで、' namedtuple'が実用的な方法です。 – MSeifert

-1

各オブジェクトに保存するデータによって異なりますが、ほとんどの場合、リストで行う必要があります。