小编Chr*_*ris的帖子

从大型组合生成器中随机采样

在高层次上,我试图从列表中的 n 个项目的所有组合中对 n_samples 个项目进行采样。在 n 值较小且列表长度相对较小时(n <= 5,len(list) < 75),这很好 - 我只是使用 itertools 生成组合,转换为列表,然后使用 random.sample 随机采样正确的数字.

但是,我的用例要求我生成组合,随机采样几千个元素,然后从列表中删除其中一个组合,然后从较小的列表重新开始。

这会在 n 和 len(list) 的高值时产生问题 - 有 120 个列表项且 n = 5,这个用例意味着我必须多次进行列表转换,因此我受到生成器的时间限制 --> 列表转换对于具有约 1.9 亿个项目的生成器。这需要非常长的时间(对于特别糟糕的示例,超过 20 分钟)。

用例不需要统计统一的样本或任何东西,我纯粹使用抽样,因为高 n 和长列表处理每个可能的组合在计算上是不切实际的,并且快速处理非常重要。

我切换到使用 iterator.islice 方法只从生成器中获取第一个 n_samples 项并使用它们。这显着提高了速度(之前需要 20 分钟的示例现在需要 34 秒),但性能受到了打击。我认为这是由于 itertools 如何生成组合 - 例如,

list(itertools.combinations(list(range(4)), 2))
Run Code Online (Sandbox Code Playgroud)

产生这个列表: [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)]

所以看起来如果我有一个足够长的列表和一个足够大的 n,仅仅通过将它们从生成器中拉出来采样甚至 100,000+ 个项目将导致 100,000+ 个项目,其中第一个元素是相同的,这是不理想的。正如我所说,我不需要完美的随机抽样,但我认为使用这种方法而不是在整个列表中随机抽样导致我的性能崩溃是由于这个原因。

基本上,我需要一种好方法来有效地从长度为 n 的所有可能组合(其中 n 通常在 2-8 左右的范围内)中对 …

python random combinations python-itertools

5
推荐指数
1
解决办法
709
查看次数

标签 统计

combinations ×1

python ×1

python-itertools ×1

random ×1