問題タブ [memoryview]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - メモリビューのスライスを C 文字列 (unsigned char*) にキャストするにはどうすればよいですか?
以下は、この問題が発生しているコードです。
これは単純な例としては少し多すぎるコードかもしれませんが、考えてみればそれほど多くはありません。ループの前の部分は、あらゆる種類のエッジ ケースを除外することを扱います。それらは、この質問には関係ありません。唯一の重要な部分は、最初の引数がバッファ プロトコルを実装する必要があり、2 番目の引数がファイル名であることです。
したがって、ファイルに書き込むために、メモリ ビューのスライスを取得し、それを へのポインタを期待する C 関数に渡しますunsigned char
。私の人生では、Cythonを使用してこれを行う方法を理解できません...上記のコードのあらゆる種類の順列を試しましたが、ほとんどの場合、取得しています
一時的な Python 参照の安全でない C 派生物の保存
それが何を生成しようとしていたかについてのヒントはありません。
in_view.buf[x]
上記のコードには、使用方法と必要なタイプを持たせる方法がわからなかったため、重複がいくつかあります。私もそれを試したことを示すために、ここに残しました。
Cython メモリ ビューにはバグがあるため、同様の質問に対する回答は機能しません。別の回答をいただければ幸いです。
string - Python 3 文字列でメモリビューを使用するには?
Python 3 では、次を実行します。
エラーが発生します:
文字列を受け入れるにはどうすればよいですか、memoryview
または に受け入れられるようにするには、文字列にどのような変換を行う必要がありmemoryview
ますか?
python - Cython: メモリビューのサイズ属性
Cython で多くの 3D メモリビューを使用しています。
のすべての要素をループしたいことがよくありa
ます。次のようなトリプルループを使用してこれを行うことができます
i
インデックス、j
および を気にしない場合は、次k
のようにフラット ループを実行する方が効率的です。
size
ここで、配列内の要素数 ( ) を知る必要があります。shape
これは、属性の要素の積、つまりsize = a.shape[0]*a.shape[1]*a.shape[2]
、またはより一般的には によって与えられますsize = np.prod(np.asarray(a).shape)
。これらはどちらも書きにくいと思いますし、(小さいながらも) 計算上のオーバーヘッドが気になります。これを行う良い方法はsize
、memoryviews の組み込み属性を使用することですsize = a.size
。ただし、理解できない理由により、Cython によって生成された注釈 html ファイルから明らかなように、これは最適化されていない C コードにつながります。具体的には、によって生成される C コードsize = a.shape[0]*a.shape[1]*a.shape[2]
は単純です。
から生成されたCコードはどこにありますsize = a.size
か
上記のコードを生成するために、コンパイラ ディレクティブを使用して可能なすべての最適化を有効にしました。つまり、 によって生成された扱いにくい C コードをa.size
最適化して取り除くことはできません。size
「属性」は実際には事前に計算された属性ではなく、実際にはルックアップ時に計算を実行するように見えます。shape
さらに、この計算は、単純に属性の積を取得するよりもかなり複雑です。docsに説明のヒントが見つかりません。
a.shape[0]*a.shape[1]*a.shape[2]
この動作の説明は何ですか?このマイクロ最適化を本当に気にかけているのであれば、書くよりも良い選択がありますか?