問題タブ [bit-packing]

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.

0 投票する
2 に答える
384 参照

python - Python: バイナリ値の 2 次元配列を UINT64 配列にパックする最速の方法

サイズ(149797, 64)の 2D UINT8 numpy 配列があります。各要素は 0 または 1 です。各行のこれらのバイナリ値をUINT64値にパックして、結果として形状 149797 の UINT64 配列を取得したいと考えています。numpy bitpack 関数を使用して次のコードを試しました。

packbits 関数の実行には約10 ミリ秒かかります。この配列自体の単純な 再形成には約7ミリ秒かかるようです。また、シフト操作を使用して2次元のnumpy配列を反復して、同じ結果を達成しようとしました。しかし、速度の改善はありませんでした。

最後に、CPU 用のnumbaを使用してコンパイルしたいとも考えています。

njitを使用すると、約6 ミリ秒かかります。

これがパラレルnjitバージョンです

3.24msの実行時間( google colabデュアル コア 2.2Ghz) でわずかに優れています。

この変換をさらに高速化するにはどうすればよいでしょうか? スピードアップを達成するために、ベクトル化 (または並列化)、ビット配列などを使用する余地はありますか?

参照: uint16 配列への numpy packbits パック

12コアのマシン(Intel(R) Xeon(R) CPU E5-1650 v2 @ 3.50GHz) では、

Pauls 法: 1595.0マイクロ秒 (マルチコアを使用していないと思われます)

Numba コード: 146.0マイクロ秒 (前述の parallel-numba)

つまり、約10倍のスピードアップ!!!

0 投票する
1 に答える
131 参照

python - Pythonで文字列をパックする適切な方法

5 バイトの asci 文字列を python にパックして、8 バイトでリトルエンディアンにする正しい方法は何ですか? たとえば、次のようなものです。

または:

これを行う正しい(または最も簡単な)方法は何ですか?理想的には、次のようなものです。

しかし、リストを渡すことも、変数のアンパックを行うこともできないようで、すべての文字に対して新しい位置引数を実行する必要があります。


私が思いつくことができる最善の方法は次のとおりですが、それを行うためのより良い方法があることを願っています。


更新:これが最善の方法のようです:

sページの、b、およびcのすべての異なる「文字」っぽいタイプについてはわかりませんstruct