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 をファイルに書き込むことですが、正確な使用例がわからないため、それが実行可能かどうかはわかりません。