バイナリデータ文字列をPythonで数値に変換する最も速い方法は何ですか?Pythonでの高速バイナリデータ変換
私はstruct.unpack_from()
を使用していますが、パフォーマンスの限界に達しています。
コンテキスト:入力ストリームは、バイナリデータとASCIIデータが混在しています。 ASCIIデータの変換はctypeを使用してCで行われます。 ctypesを使用してCでアンパックを実装すると、アンパックするときと同様のパフォーマンスが得られました。私の推測では、コールのオーバーヘッドはあまりにも大きな要因でした。私はネイティブなCのような強要方法を見つけることを望んでいました(しかしPython以外)。ほとんどの場合、このコードはすべてCに移動する必要があります。
ストリームはネットワークバイトオーダー(ビッグエンディアン)で、マシンはリトルエンディアンです。例えば、変換は次のようになります。
import struct
network_stream = struct.pack('>I', 0x12345678)
(converted_int,) = struct.unpack_from('>I', network_stream, 0)
私は、バイナリ変換の一般的な場合よりも、ストリーム形式の取り扱いについてはあまり心配し、unpack
にでも代替がある場合。たとえば、socket.ntohl()
にはintが必要で、int()
はバイナリデータ文字列を変換しません。
お寄せいただきありがとうございます!
正確に何を開梱していますか?単なる数値の配列ですか? –
残念ながら、それはシングルトンの混合ストリームです。内容はヘッダーで示されます。ほとんどの変換は4Bの整数と浮動小数点数です。 – CNK
テストケースはここでうれしい – Triptych