1

long int (m39 プライム) を取り、バイナリ ファイルとして保存しようとしています。bin 値をファイルに書き込もうとすると、文字列として書き込まれます。

>>> m39 = bin(2**13466917-1)
>>> open('m39', 'wb').write(m39) 
madsc13ntist@jaberwock:~/Desktop$ xxd m39 | head
0000000: 3062 3131 3131 3131 3131 3131 3131 3131  0b11111111111111
0000010: 3131 3131 3131 3131 3131 3131 3131 3131  1111111111111111
0000020: 3131 3131 3131 3131 3131 3131 3131 3131  1111111111111111
0000030: 3131 3131 3131 3131 3131 3131 3131 3131  1111111111111111
0000040: 3131 3131 3131 3131 3131 3131 3131 3131  1111111111111111
0000050: 3131 3131 3131 3131 3131 3131 3131 3131  1111111111111111
0000060: 3131 3131 3131 3131 3131 3131 3131 3131  1111111111111111
0000070: 3131 3131 3131 3131 3131 3131 3131 3131  1111111111111111
0000080: 3131 3131 3131 3131 3131 3131 3131 3131  1111111111111111

これにはとてつもなく単純な答えがあると確信していますが、m39をbytearrayまたは書き込み用のバッファに変換することに成功していません。ioまたはmemoryviewなどを使用する必要がありますか?

どなたでもご利用いただけますので、どうぞよろしくお願いいたします。:)

私は Python 2.7.3 を使用していますが、可能な限り組み込みモジュールを使用したいと考えています。

編集: ディスク/メモリの占有スペースがはるかに少ないバイナリ ファイルとして値を保存しようとしています。bin 型が python の文字列であることは理解していますが、書き込もうとしています\x11\x11\x11\x11 not \x31\x31\x31\x31。私の意図は、値の文字列表現を出力することではなく、後で使用/操作するために効率的に保存することです。

4

2 に答える 2

2

Pythonpickleモジュールは非常に効率的です。表現は、未加工のバイナリ値を格納できるよりも 8 バイト長いだけです。これは Python 2.X または 3.X で機能します。

import pickle
m39 = 2**13466917-1
with open('m39.dat','wb') as f:
    pickle.dump(m39,f,pickle.HIGHEST_PROTOCOL)

結果の 16 進ダンプ (1,683,373 バイト):

 80 03 8B A5 AF 19 00 FF FF FF ... FF FF FF 1F 2E

読み返すには:

import pickle
with open('m39.dat','rb') as f:
   m39 = pickle.load(f)

Python 3 にも整数に対するメソッドto_bytesfrom_bytesメソッドがありますが、バイト単位の整数の長さを計算する必要があるため、もう少し作業が必要です。

import math
m39 = 2**13466917-1
s = m39.to_bytes(math.ceil(m39.bit_length()/8),'little')
with open('m39.dat','wb') as f:
    f.write(s)

結果の 16 進ダンプ (1,683,365 バイト):

 FF FF FF FF FF FF FF FF FF FF ... FF FF FF FF 1F

読み返すには:

with open('m39.dat','rb') as f:
    data = f.read()
m39 = int.from_bytes(data,'little')

明らかにそこにはパターンがあり、代わりに素数の指数を格納する方が効率的です。

于 2013-03-24T16:10:13.407 に答える
2

データの構造に応じて、構造体モジュールまたは配列のいずれかを使用する必要があります (つまり、同種の値の配列の場合、配列はより単純/高速になります)。

于 2013-03-24T15:26:38.223 に答える