对于我正在编写的程序包,我需要以随机顺序在0到2 ** 33之间的唯一数字。最初,我尝试使用Generator,如下所示:
def randomnumber(NUM):
List = [i for i in range(NUM)]
List.shuffle()
index = 0
while index < NUM:
index += 1
yield List[index-1]
但是由于我的NUM是2 ** 33,所以此代码是不可能的。我试图从bash将所有数字写入文本文件,发现文件大小为93.6 GB(这确实很大,远远超过我的RAM)。然后,我使用terashuf整理文件的内容,并使用linecache
读取文件的每一行。
而且,我正在使用多处理模块(尤其是apply_async),并且确实需要将此生成器对象作为参数传递。但是python提供了一个错误,指出它不能在池进程中使用生成器对象。我在SO上遇到了几个问题,一个答案是从生成器中为几个数字创建这些数字的列表,并将它们作为参数传递给并行运行的函数,但这也不起作用。
所以我的问题是,有什么方法可以使我们创建一个可以完成预期工作的生成器(提供介于0和2 ** 33之间的随机唯一数),或者通过其他方式来执行此操作,因为我不想一次又一次地洗净文件的内容(花费大量时间)
据我所知,您代码的要点是在0
和NUM
之间生成一个随机整数。在您的情况下,NUM
将为2**33
。
以下代码将执行此操作,您可以毫无问题地更改NUM
:
import math
import random
def generate_random(num):
yield random.randint(0, num)
#setting seed to get consistent results
random.seed(0)
# Now, let's use this simple function to generate
# 5 different random number between `0` and `2**33`:
NUM = math.pow(2, 33)
for i in range(10):
print(next(generate_random(NUM)))
# This would print these five numbers
# 7921731533
# 1806341205
# 6490875490
# 6341935620
# 3900315155