この関数:
PyObject_GetBuffer
呼び出しますPyBuffer_Release
呼び出しますPyBuffer_Release
はPyBufferProcs.bf_releasebuffer(PyObject *exporter, Py_buffer *view)
PyBuffer_Release
呼び出します。これは、ドキュメントによると_ " view
関連付けられたすべてのメモリを解放する" _であり、 view
が次のように存続する必要はありません。 exporter
限り。
したがって、原則として、 bf_getbuffer
でその場でバッファを割り当て、最後にリリースを使用したときにそれを削除するタイプは、numpyで解放後の使用を引き起こします。
バッファプロトコルの実装者が実際にこれを行っているかどうかはわかりませんが、私が読んだところによると、許可されているということです。
変ですね。 バッファ構造体フィールド(ストライドなど)がPyBuffer_Release
によって解放される一方で、ポイントされた実際のメモリは元のオブジェクトによって所有されている必要があることをバッファインターフェイスで指定したいのですが(これは非常に迷惑な_dealloc_cached_buffer_info
問題を解決します)。 これが意図で真実だと思いますが...
これで、この関数はバッファではなくPyArray_Chunk
を返すので、上記で説明したことを明確にすると、実際にはまったく問題ありません。
あなたの解釈はより合理的に聞こえます-おそらくpython / cpythonに対するプルリクエストは、私が上で説明したことを実装しないように人々に伝えるためにドキュメントを更新するのが賢明でしょう。
開く予定でしたが、最初に昼食に行きました: https ://bugs.python.org/issue39471実際にテキストの変更を提案することを検討するかもしれません。 私の解釈に同意できれば、バッファプロトコルの実装で非常に醜くて非常に遅いコードをクリーンアップできます(現在、スカラー計算が20%以上遅くなります)。 (編集:しかし、PythonがArgParseコードを修正した後でないと思いません:()
これにより、明確さが増します。ありがとうございます。Pythonがbf_releasebuffer
と同じ読み取り値を使用していることに気づいていませんでした。
くそー、私は以前にそれを読み過ぎていました(PEPから):
エクスポーターは、struct bufferinfoを介して共有する可能性のあるメモリ、ストライド、シェイプ、サブオフセット、またはフォーマット変数を再割り当てできる場合、bf_releasebuffer関数を定義する必要があります。
これは、バッファに新しいメモリチャンクを与えることが有効であるように読み取られます:(。
ただし、 array
(python one)の実装を見ると、それを使用して、バッファーが存在する場合にサイズ変更が