【发布时间】:2020-08-17 02:17:08
【问题描述】:
对于我正在编写的包,我需要随机顺序的 0 到 2**33 之间的唯一数字。最初,我尝试使用如下生成器:
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 中完成的
-
你有没有看到这个问题:stackoverflow.com/questions/49956883/…?
-
@ThierryLathuille 是的,这个问题帮助了我。我对提出的算法做了一些修改,并正在使用它。感谢您的评论!
标签: python random multiprocessing generator