【发布时间】:2017-12-26 17:54:07
【问题描述】:
我想生成随机数并将它们存储在一个列表中,如下所示:
alist = [random.randint(0, 2 ** mypower - 1) for _ in range(total)]
我关心的是:我想在(0, 2 ** mypower - 1) 的范围内生成total=40 million 值。如果mypower = 64,则alist 的大小约为20GB (40M*64*8),这对于我的笔记本电脑内存来说非常大。我有一个想法来迭代生成大量值,比如一次 500 万个,并将它们保存到一个文件中,这样我就不必一次生成所有 40M 值。我担心的是,如果我在循环中执行此操作,可以保证random.randint(0, 2 ** mypower - 1) 不会生成之前迭代中已经生成的值?像这样的:
for i in range(num_of_chunks):
alist = [random.randint(0, 2 ** mypower - 1) for _ in range(chunk)]
# save to file
【问题讨论】:
-
不,完全不保证!
-
在单块情况下甚至不会出现这种情况。
-
random.randint 随机返回值。 random.randint(x, y) 每次调用它时都有相同的机会返回 x, y 范围内的任何数字。您可以计算得到重复的机会,考虑到您所采样的大小,我认为这会非常低,但如果您想完全避免重复,则需要使用其他东西。
-
为什么是“*68*8”?我很确定你高估了这一点。
-
你到底是怎么得到这个号码的?一个列表每个指针将占用 8 个字节(在 64 位 CPython 上),因此列表本身将占用超过 300MB 的空间,整数本身将占用 24 个字节,因此额外的 915MB 给予或占用 - 或约 1.2GB 的内存对于这样的清单。这是纯 Python,您可以使用更优化和简化的库在内存中塞入更多数据。