正如Dan D.所说,让numpy
以C速度一次性生成您的字节将比以Python速度逐个生成字节要快得多。
但是,如果您不想使用numpy
,您可以使您的代码更加高效。
通过连接构建字符串,例如buf = buf + chr(random.randint(0,255))
非常慢,因为在每个循环中都必须分配一个新的buf
(请记住,Python字符串是不可变的)。在Python中从子字符串构建字符串的通常技术是在列表中累积子字符串,然后使用str.join()
方法一次性将它们组合起来。
我们还可以通过预先生成我们的1字节字符串列表而不是为我们想要的每个字节调用chr()
来节省一点时间。
from random import seed, choice
allbytes = [chr(i) for i in range(256)]
def random_bytes(n):
bytes = []
for _ in range(n):
bytes.append(choice(allbytes))
return ''.join(bytes)
我们可以使用列表推导式来简化这个过程,使其稍微更加高效:
def random_bytes(n):
return ''.join([choice(allbytes) for _ in range(n)])
根据您打算如何使用这些随机字节,将它们放入bytearray或bytes
对象中可能会很有用。
这是基于cristianmtr的新答案的变体:
def random_bytes(n):
return bytes(bytearray(getrandbits(8) for _ in xrange(n)))
你可以使用
str()
代替
bytes()
,但在 Python 3 中,
bytes()
更好,因为 Python 3 字符串是 Unicode。
urandom
从系统噪音中获取其随机性(请参阅 Linuxurandom
手册页),因此允许其播种没有意义。无法进行播种测试有时很烦人,但另一方面它成为了密码学目的的有用随机源。我想这并不是你的问题真正关心的部分,但至少可以解释为什么没有办法对其进行播种。 :) - PM 2Ring