2017-11-23 5 views
0

私は大量のデータを繰り返し処理し、値を正しく整理しようとしています。コンテキスト:データは、生のバイデータから解釈された大きな整数の集合です。整数は実際には密にパックされたデータであり、その上にバイトは「リトルエンディアン」の順番です。したがって、適切な値を得るためには、3つの値を読み込み、それぞれのニブルを抽出し、それらをすべて正しい向きに並べ替える必要があることがわかりました。Pythonで幾分複雑なバイナリアルゴリズムを最適化するにはどうすればいいですか?

最後に私の質問に。このプロセスをスピードアップしたり、最適化するにはどうすればよいのでしょうか?今は1つのファイルからすべてのデータを取得するのに1分以上かかるので、何千ものファイルがある可能性があります。

for i in range(0, len(data), 3): 
      j = struct.pack("=I", data[i]) 
      p = struct.pack("=I", data[i + 1]) 
      q = struct.pack("=I", data[i + 2]) 
      nibble0 = j[1] >> 4 
      nibble1 = j[1] & 15 
      nibble2 = j[0] >> 4 
      nibble3 = j[0] & 15 
      nibble4 = j[3] >> 4 
      nibble5 = j[3] & 15 
      nibble6 = j[2] >> 4 
      nibble7 = j[2] & 15 
      nibble8 = p[1] >> 4 
      nibble9 = p[1] & 15 
      nibble10 = p[0] >> 4 
      nibble11 = p[0] & 15 
      nibble12 = p[3] >> 4 
      nibble13 = p[3] & 15 
      nibble14 = p[2] >> 4 
      nibble15 = p[2] & 15 
      nibble16 = q[1] >> 4 
      nibble17 = q[1] & 15 
      nibble18 = q[0] >> 4 
      nibble19 = q[0] & 15 
      nibble20 = q[3] >> 4 
      nibble21 = q[3] & 15 
      nibble22 = q[2] >> 4 
      nibble23 = q[2] & 15 

k.append((nibble0 << 12) | (nibble1 << 8) | (nibble2 << 4) | 0) 

k.append((nibble3 << 12) | (nibble4 << 8) | (nibble5 << 4) | 0) 

k.append((nibble6 << 12) | (nibble7 << 8) | (nibble8 << 4) | 0) 

k.append((nibble9 << 12) | (nibble10 << 8) | (nibble11 << 4) | 0) 

k.append((nibble12 << 12) | (nibble13 << 8) | (nibble14 << 4) | 0) 

k.append((nibble15 << 12) | (nibble16 << 8) | (nibble17 << 4) | 0) 

k.append((nibble18 << 12) | (nibble19 << 8) | (nibble20 << 4) | 0) 

k.append((nibble21 << 12) | (nibble22 << 8) | (nibble23 << 4) | 0) 

私はAnacondaまたはPypyまたはプリビルドされたPythonパッケージを使用しないでこれを行うことを検討しています。あなたが唯一のデバッグの目的のためにニブルを必要とし、あなたには、いくつかの操作を除外することができることを

+0

あなたのコードニブルへaccordigngは、各反復でreasignedされ、それが –

+0

上で何が起こっているのかは明らかではないのですが外k.appendですループの? cProfileは何が遅いかを教えてくれるが、もしそれがその一部であれば、ファイルが少し大きければそれは有力な貢献者だろう。あなたが持っている比較のtemp_listに、k + = tmp_listでそれを一度加えることができる。 – ahed87

+0

ルックアップテーブル/ dict? - 12ビットまたは16でも不合理でない – f5r5e5d

答えて

0

注:

 nibble0 = j[1] >> 4 
     nibble1 = j[1] & 15 
     nibble2 = j[0] >> 4 
     k.append((nibble0 << 12) | (nibble1 << 8) | (nibble2 << 4) | 0) 

    is equivalent to 

     k.append((j[1] << 8) | (j[0] % F0)) 

    and 
     nibble3 = j[0] & 15 
     nibble4 = j[3] >> 4 
     nibble5 = j[3] & 15 
     k.append((nibble3 << 12) | (nibble4 << 8) | (nibble5 << 4) | 0) 

    is equivalent to 

     k.append((j[0] << 12) | (j[3] << 4)) 

    (if k gets 16-bit values, otherwise clear MSB bits of j[0]) 
関連する問題