【发布时间】:2021-07-10 08:33:22
【问题描述】:
我想将m*n 元素(例如,1、2、...、m*n)随机均匀地分成n 组,这样每个组都有m 随机元素。每个组将同时处理来自其自己组的k (k>=1) 元素,并且以相同的速度(通过某种同步机制),直到所有组都处理完自己的所有元素。实际上每个组都在一个独立的进程/线程中。
我使用numpy.random.choice(m*n, m*n, replace=False)先生成排列,然后索引每个组的排列结果。
问题是当m*n非常大时(例如>=1e8),速度很慢(几十秒或几分钟)。
有没有更快/更懒惰的方法来做到这一点?我想也许这可以用更懒的方式来完成,不是第一次生成置换结果,而是先生成一个生成器,在每组中,每次生成k个元素,其效果应该和我目前使用的方法。但是我不知道如何实现这种懒惰的方式。而且我不确定这是否可以实际实施。
【问题讨论】:
-
您的目标似乎是由多个线程并行生成 N 项的排列。以下内容可能会为您指明正确的方向:github.com/lorenzhs/sampling。此外,生成一个排列相当于生成 N 个指数变量并对它们进行排序 (arxiv.org/pdf/1903.00227.pdf)。如果这有助于您找到答案,您可以发布它。
-
@PeterO。谢谢!看起来很有希望!我先试试看。
-
您找到解决方案了吗?如果是这样,您应该将该解决方案作为答案发布。
-
@PeterO。我还没有找到令人满意的解决方案,但我组成并实现了一个序列服务器,每次使用 Fisher-yates 算法生成一个数字,并将生成的数字放入
n队列以供n进程从中获取。
标签: python random generator permutation lazy-sequences