ランダムバイナリファイルの作成 質問する

ランダムバイナリファイルの作成 質問する

Python を使用してランダムなバイナリ ファイルを作成しようとしています。これはすでに取得しているものです:

f = open(filename,'wb')
for i in xrange(size_kb):
    for ii in xrange(1024/4):
        f.write(struct.pack("=I",random.randint(0,sys.maxint*2+1)))

f.close()

しかし、これは非常に遅いです (私の 3.9GHz SSD ディスク マシンでは、size_kb=1024 で 0.82 秒)。大きなボトルネックとなっているのは、ランダムな int の生成のようです (randint() を 0 に置き換えると、実行時間が 0.82 秒から 0.14 秒に短縮されます)。

今では、ランダム データ ファイルを作成するより効率的な方法 (つまり、dd if=/dev/urandom) があることはわかっていますが、好奇心からこれを理解しようとしています...これを改善する明白な方法はありますか?

ベストアンサー1

私見ですが、以下は完全に冗長です。

f.write(struct.pack("=I",random.randint(0,sys.maxint*2+1)))

を使用する必要は全くありませんstruct.pack。次のようにするだけです:

import os

fileSizeInBytes = 1024
with open('output_filename', 'wb') as fout:
    fout.write(os.urandom(fileSizeInBytes)) # replace 1024 with a size in kilobytes if it is not unreasonably large

次に、整数の読み取りにファイルを再利用する必要がある場合は、struct.unpack次のようにします。

(私のユースケースはユニット テスト用のファイルを生成することなので、他の生成されたファイルと同一ではないファイルだけが必要です)。

もう 1 つのオプションは、UUID4 をファイルに書き込むことですが、正確な使用例がわからないため、それが実行可能かどうかはわかりません。

おすすめ記事