クラスを派生させてlist
からクラスを派生させ、いくつかのインスタンス属性を追加してハッシュ可能にしたいと考えています。それを行うには良い(早くてきれいな)方法は何ですか?リストサブクラスをハッシュ可能にする
UPDATE:
私は、ユースケースの長い説明を削除しました。私はまた、関連しているが別々の問題をdifferent questionに移しました。
クラスを派生させてlist
からクラスを派生させ、いくつかのインスタンス属性を追加してハッシュ可能にしたいと考えています。それを行うには良い(早くてきれいな)方法は何ですか?リストサブクラスをハッシュ可能にする
UPDATE:
私は、ユースケースの長い説明を削除しました。私はまた、関連しているが別々の問題をdifferent questionに移しました。
このコードは問題ありません。あなたはリストのコピーを作っていますが、それは少し遅いかもしれません。
def __hash__(self):
return hash(tuple(self.list_attribute))
高速化したい場合は、いくつかのオプションがあります。タプルではなく、リストとして
list_attribute
サブクラスの場合のみに焦点を絞るように質問を短縮したので、タプルのオプションは消えます( '__init__'では変更できないので)。'__init__ '時間での計算はすばらしいアイディアですが、この場合だけでなく、いつも*良いアイデアではないのでしょうか?それでも、もちろん3番目の選択肢よりも遅いでしょう。 – max
これは、オブジェクトがハッシュされる回数によって異なります。大文字小文字が0の場合は、前もってやりたいとは思わない。一般的なケースが* many *の場合は、事前計算が最善です。 –
ハッシュを格納することもメモリ、btwを無駄にします。 –
あなたはself
にtuple
を適用することができます。self
を-ing
class State(list):
def __hash__(self):
return hash((self.some_attribute, tuple(self)))
tuple
は全体のハッシュ・プロセスの約半分の時間を要する:
from timeit import timeit
setup = "from __main__ import State; s = State(range(1000)); s.some_attribute = 'foo'"
stmt = "hash(s)"
print(timeit(stmt=stmt, setup=setup, number=100000))
setup = "r = list(range(1000))"
stmt = "tuple(r)"
print(timeit(stmt=stmt, setup=setup, number=100000))
プリント
0.9382011891054844
0.3911763069244216
ありがとうございます。それはあまりにも悪くはないようです。 – max
これは答えよりもコメントのほうが多いですが、コメントになるには時間がかかりすぎます。
class Data(tuple):
def __new__(klass, arg):
data_inst = tuple.__new__(klass, arg)
data_inst.min = min(data_inst)
data_inst.max = max(data_inst)
return data_inst
>>> d = Data([1,2,3,4])
>>> d
(1, 2, 3, 4)
>>> d.min
1
>>> d.max
4
>>> d1 = Data([1,2,3,4,5,6])
>>> d1.max
6
>>> d.max
4
それはあなたが求めている正確に何を伝えるのは難しい:これは、1つの缶が
__new__
内部からの属性のインスタンスにアクセスする方法です。 –タプルを使用できないのはなぜですか?名前付きアトリビュートがある場合のみ、[namedtuple'](http://docs.python.org/py3k/library/collections.html#collections.namedtuple)があります。 – delnan
'hash(tuple(self))'を使用できますか? – WolframH