Python 创建随机二进制文件

Python 创建随机二进制文件,python,random,Python,Random,我正在尝试使用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磁盘机上,大小为1024的硬盘需要0.82秒)。一个很大的瓶颈似乎

我正在尝试使用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磁盘机上,大小为1024的硬盘需要0.82秒)。一个很大的瓶颈似乎是随机整数生成(将randint()替换为0将运行时间从0.82秒减少到0.14秒)


现在我知道有更有效的方法来创建随机数据文件(即dd if=/dev/uradom),但出于好奇,我正在尝试解决这个问题。。。有没有一个明显的方法来改善这一点?

IMHO-以下是完全多余的:

f.write(struct.pack("=I",random.randint(0,sys.maxint*2+1)))
完全不需要使用
struct.pack
,只需执行以下操作:

import os

with open('output_file', 'wb') as fout:
    fout.write(os.urandom(1024)) # replace 1024 with size_kb if not unreasonably large
然后,如果需要重新使用该文件读取整数,则
struct.unpack
Then

(我的用例正在为单元测试生成一个文件,所以我只需要一个 与其他生成的文件不同的文件)


另一种选择是只向文件中写入UUID4,但由于我不知道确切的用例,我不确定这是否可行。

您应该编写的python代码完全取决于您打算使用随机二进制文件的方式。如果你只是需要一个“相当好”的随机性用于多种目的,那么Jon Clements的代码可能是最好的

但是,至少在Linux操作系统上,OS.uradom依赖于/dev/uradom,Linux内核(drivers/char/random.c)中对此进行了如下描述:

/dev/uradom设备[…]将返回尽可能多的字节 请求。随着越来越多的随机字节被请求而没有给出 熵池重新充电的时间,这将导致随机 仅在加密上强大的数字。对许多人来说 然而,这是可以接受的

所以问题是,你的申请可以接受吗?如果您喜欢更安全的RNG,可以改为在/dev/random上读取字节。这个设备的主要缺点是:如果Linux内核不能收集足够的熵,它可能会无限期地阻塞。还有其他加密安全的RNG,如


P>可选的,如果你主要关心的是执行速度,如果你只需要蒙特卡洛方法的一些“轻便随机性”(即不可预测性并不重要,均匀分布确实),你可以考虑生成一个随机二进制文件,并且多次使用它,至少对于开发来说是这样。

这里有什么“随机”的要求?你只是需要无用的、看似随机的数据,还是需要加密的强随机性?因为如果是前者,那么你可以用一个非常简单的PRNG(或者甚至是一个微不足道的计数器!)来代替randint。只是出于好奇-你使用random.SystemRandom有什么改进吗?random.SystemRandom的性能要差得多(1.27s而不是0.82)。Joachim提出了一个很好的观点(我的用例是为单元测试生成一个文件,所以我只需要一个与其他生成的文件不同的文件)。但是,正如我在问题中提到的,使用全零的性能也不是很好,也许我应该更具体一点:有没有一种方法可以优化文件操作?我一直在考虑每轮写入更多字节。谢谢,这正是我想要的,之前我没有偶然发现os.URADOM()。如果我需要创建大型文件,我应该使用什么方法?至少5GB?使用本机操作系统工具。e、 g.linux:ddif=/dev/uradom of=${FILENAME}bs=4M count=1。保持bs=4M不变。把计数改为1200。应该生成足够大的文件。永远不要选择B到低,这需要更多的时间。我只是需要一种方法来创建一个大小可调的文件,填充随机数据,这样两个文件就可以完全相同了。文件用于测试上载机制的测试脚本。随机性的质量对我来说并不重要,但希望你的回答能对需要良好随机性的人有所帮助。