Python:巨大列表生成器的替代方法

问题描述 投票:0回答:1

对于我正在编写的程序包,我需要以随机顺序在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之间的随机唯一数),或者通过其他方式来执行此操作,因为我不想一次又一次地洗净文件的内容(花费大量时间)

python random multiprocessing generator
1个回答
0
投票

据我所知,您代码的要点是在0NUM之间生成一个随机整数。在您的情况下,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
© www.soinside.com 2019 - 2024. All rights reserved.