1

set.setではなくset()が組み込まれたPython2.6を使用します。

組み込みのset()オブジェクトを使用して、いくつかのセットのメンバーになるカスタムデータ抽象化クラスを定義しました。

クラスは、セットに分割される前に、すでに別の構造に格納されています。クラスのすべてのインスタンスが最初に宣言されます。最初のセットが宣言された後、クラスインスタンスは作成または削除されません。2つのクラスインスタンスが互いに「等しい」と見なされることはありません。(同一のデータを含むクラスの2つのインスタンスは、同じではないと見なされます。A== Bは、BがAではないすべてのA、Bに対してFalseです。)

上記を考えると、テストのためのこれらの戦略の間に合理的な違いはありますset_a == set_bか?:

オプション1: クラスのインスタンスを一意に識別するセットに整数を格納します。

オプション2: クラスのインスタンスを保存し、id(self)== id(other)を実装__hash__()して比較します。__eq__()(これは必要ないかもしれませんか?これらの関数のデフォルトの実装はobject同じことをしますが、より速くなりますか?)おそらく、新しいインスタンスが呼び出すたびにインクリメントするインスタンス変数を使用します__init__()。(スレッドセーフではありませんか?)

また、

オプション3: インスタンスはすでに保存されており、かなり長い文字列でキー設定された辞書で検索されます。文字列は、インスタンスが何であるかを最も直接的に表すものであり、一意に保たれます。__eq__()これらの文字列をセットに格納すると、RAMのオーバーヘッドが発生したり、とを呼び出して追加のランタイムを作成したりすることになると思いました__hash__()。そうでない場合は、文字列を直接保存する必要があります。(しかし、私がこれまで読んだことは、それが事実であると私に教えてくれると思います。)

私はPythonのセットに少し慣れていません。私はすでに知っておくべきことのいくつかを理解しました。トリッキーなことを見落としたり、どこかで誤った結論を導き出したりしていないことを確認したいだけです。

4

1 に答える 1

1

質問を誤解しているかもしれませんが、Python のデフォルトの動作は次のとおりです。

class Foo(object):
    pass

a = Foo()
b = Foo()
c = Foo()

x = set([a, b])
y = set([a, b])
z = set([a, c])

print x == y # True
print x == z # False

オブジェクト内のこれらの関数のデフォルトの実装は、同じことをより高速に実行しますか?

はい。User-defined classes have __cmp__() and __hash__() methods by default; with them, all objects compare unequal (except with themselves) and x.__hash__() returns id(x). ドキュメント

于 2012-09-25T08:02:24.880 に答える