問題タブ [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 - 2 つの小さな numpy 関数を Cythonize します。助けが必要です
問題
いくつかの科学的な目的で、numpy ndarrays を主に扱う 2 つの小さな関数を Cythonize しようとしています。これら 2 つの小さい関数は、遺伝的アルゴリズムで何百万回も呼び出され、アルゴリズムにかかる時間の大部分を占めています。
私は自分である程度の進歩を遂げ、どちらもうまく機能しましたが、速度はわずかに向上しました (10%)。さらに重要なことに、cython --annotate は、コードの大部分がまだ Python を使用していることを示しています。
コード
最初の関数:
この関数の目的は、データのスライスを取得することであり、内側のネストされたループで何百万回も呼び出されます。data[1][1] の bool に応じて、順方向または逆方向のいずれかでスライスを取得します。
第二の機能
これはnumpy配列のタプルのリストを取得し、配列を要素ごとに合計し、それらを正規化し、交差の統合を取得したいと考えています。
どんな助けでも大歓迎です - 私はメモリビューを使ってみましたが、何らかの理由でコードがずっと遅くなりました。
python - memoryview の微積分 (python 配列)
Python配列でmemoryviewを使用するつもりです:
しかし、それはエラーを引き起こしました:
'*' のオペランドの型が無効です (double; double[:, :])
この状況で何ができますか?
python - 連続していないメモリ位置のメモリビューを作成する方法は?
メモリ内に断片化された構造があり、連続しているように見えるメモリビューとしてアクセスしたいと考えています。これを行う簡単な方法はありますか、それとも独自のソリューションを実装する必要がありますか?
たとえば、レコードで構成されるファイル形式を考えてみましょう。各レコードには、レコードのコンテンツの長さを指定する固定長ヘッダーがあります。より高いレベルの論理構造は、複数のレコードにまたがる場合があります。断片化されたメモリの場所を単純な連続したバイト配列として認識できれば、より高いレベルの構造の実装が容易になります。
アップデート:
少なくともドキュメントのこの部分に基づいて、Pythonはこの「セグメント化された」バッファタイプを内部的にサポートしているようです。ただし、これは C API のみです。
アップデート2:
私が見る限り、参照されている C API (古いスタイルのバッファーと呼ばれる) は必要なことを行いますが、現在は廃止されており、新しいバージョンの Python (3.X) では使用できません。PEP 3118で指定された新しいバッファ プロトコルは、バッファを表す新しい方法を提供します。この API は、ほとんどのユース ケース (その中でも、表現されたバッファーがメモリ内で連続していないユース ケース) でより使いやすくなっていますが、1 次元配列を完全に自由に配置できる (複数の異なる複数の) ユース ケースはサポートしていません。サイズのチャンク) をメモリに格納します。
cython - cython メモリ ビューをピクルできないのはなぜですか?
memoryview 配列を使用する cython モジュールがあります。つまり...
マルチプロセッシングを使用して、このモジュールを並行して実行したいと考えています。ただし、次のエラーが表示されます。
メモリ ビューをピクルできないのはなぜですか。また、それに対して何ができますか。
python - Python numba.jit タイプ
私は一日中numbaのドキュメントから型がどのように設定されているかを推測しようとしていました. 私は少し道のりを歩んできましたが、今は 1 次元配列と 2 次元配列を返し、引数の束を取る関数を作りたいと思っています。
上記は次の例外をスローします。
何がうまくいかないのか教えていただければ幸いですが、これらの構文をきっぱりと厳密に説明しているドキュメントを推奨していただけるとさらによいでしょう。
お時間をいただきありがとうございます。
よろしく、マリウス
python - 戻り値としての Cython Memoryview
次のダミーの Cython コードを検討してください。
ここで、これに対してcython -aを実行すると、return ステートメントが黄色で表示されます。非常にパフォーマンスが重要なプログラムで同様のことを行っていますが、プロファイリングによると、コードの速度が本当に低下しています。では、なぜ cython はこれらの return ステートメントに python を必要とするのでしょうか? 注釈付きファイルはヒントを提供します。
驚くべきことに、 cython の「Memoryview return value is not initialized」をGoogle 検索しても結果はゼロです。
python - Cython: メモリ ビューを NumPy 配列に変換する
型付きメモリビューをcythonのNumPy配列に変換するには? ドキュメントには
私はこれを私の場合に取った
これを使用すると、コンパイラは次のように教えてくれます。
コピーするかどうかはそれほど決定的ではありません。私はこれについて助けを見つけることができませんでした。
python - Cython: 型付きメモリ ビューに double ではなく np.float_t を使用する必要があります
cython のメモリビューに関して、numpy float 配列を使用している場合にnp.float_t
単純に行うのではなく、 NumPy 型でビューを入力する利点はありますか?double
そしてcdef
、同じように入力する必要があります。
python - Cython:NumPy配列なしでメモリビューを作成しますか?
メモリ ビューが便利で高速であることがわかったので、cython で NumPy 配列を作成することを避け、指定された配列のビューを操作するようにしています。ただし、既存の配列を変更するのではなく、新しい配列を作成することが避けられない場合があります。上位の関数ではこれは目立ちませんが、頻繁に呼び出されるサブルーチンでは目立ちます。次の関数を検討してください
プロファイリングは、ここで得られる速度があることを教えてくれます。私
ができることは、関数を適応させることです。たとえば、このベクトルの平均が計算されたり、合計が計算されたりすることがあります。だから、合計したり平均を取ったりするために、それを書き直すことができました。しかし、サイズを動的に定義して、オーバーヘッドがほとんどないメモリビューを直接作成する方法はありませんか。最初に etc を使用してac バッファーを作成し、関数の最後でバッファーをビューに変換し、ポインターとストライドなどを渡すようなもの..
malloc
編集1: 単純なケースの場合、たとえばこのように関数を適応させることは、受け入れられるアプローチです。引数と合計/平均を取るだけを追加しました。この方法では、配列を作成する必要がなく、関数 malloc 内で簡単に処理できます。これ以上は速くなりませんよね?