2016-04-14 8 views
2

私が処理する均一な型と非ハッシュ可能Pythonオブジェクトのコレクションが含まれているのpython setを持っています。 アクセスのpythonオブジェクトポインタデータが

は私のアルゴリズムの効率を向上させるために、私は uint64などのデータ値を受け入れる外部インデックスの実装でctypesのを使用してインターフェイスしたいと思います。

私はuint64として、この外部ライブラリにPythonオブジェクトへのポインタ参照を渡すことができることを期待していましたか?

私はctypes.cast(ctypes.py_object(my_python_object), ctypes.c_uint64)を試みたが、ctypes.ArgumentError: argument 1: <class 'TypeError'>: wrong typeを取得しています。

また、どのような逆の、uint64としてPythonオブジェクトへの参照を取得し、「本当の」Pythonオブジェクトにそれを回すでしょうか?

+0

真剣に、 'id()'の使用には何が問題になりますか? –

+0

@AnttiHaapala真剣に何も。 :-)私はそれが存在することを実感したことはありません。 'id()'の値からPythonオブジェクトを取得する可能性はありますか?もしそうでなければ、私は常に 'set'をキーとしてIDを使って' dict'に変換することができます。 – ARF

+0

あなたのオブジェクトが死んでいる場合は、 'id()'から戻すことはできません。代わりにあなたのインターパーターをクラッシュさせます:D –

答えて

4

なぜCPythonでid()関数を使用しないのですか?

>>> x 
<object object at 0x7fd2fc742090> 
>>> hex(id(x)) 
'0x7fd2fc742090' 

CPython documentation of id()

は言うこと

id(object)

戻るオブジェクトの「アイデンティティ」。これは、そのオブジェクトの存続期間中に一意で定数であることが保証されている整数です。寿命が重複しない2つのオブジェクトの値は同じid()になる場合があります。

CPythonの実装の詳細:これは、メモリ内のオブジェクトのアドレスです。


あなたが戻ってPythonオブジェクトへのあなたのこのuint64_tを「変換」するためにしている場合にも、参照カウントなどを台無しにする必要があります。私が知る限り、​​は、Pythonの参照カウントを簡単に増減することはできません。

+0

多くのありがとうございます。しかしなぜ 'hex()'? – ARF

+0

厳密に言えば、この実装の詳細は将来変更される可能性があります。 – user2357112

+0

過去に 'object .__ hash__'(実際に変更されました)(http://bugs.python.org/issue5186)と非常によく似ています。もはや 'id(self)'を返すことはありません。たとえば、 'object .__ hash__'で発生した同じ種類のバケットの衝突を減らすために、' id 'を変更することを決心したとしても、私は全く驚いていません。 – user2357112

関連する問題