gpt4 book ai didi

python - 在 python 中延迟抽取随机结果

转载 作者:太空狗 更新时间:2023-10-30 00:15:32 24 4
gpt4 key购买 nike

Python 问题。我正在生成大量对象,我只需要制作一个小的随机样本。实际上生成有问题的对象需要一段时间,所以我想知道是否有可能以某种方式跳过那些不需要生成的对象,只显式创建那些已经采样的对象。

换句话说,我现在有

a = createHugeArray()
s = random.sample(a,len(a)*0.001)

这是相当浪费的。我更喜欢更懒惰的东西,比如

a = createArrayGenerator()
s = random.sample(a,len(a)*0.001)

我不知道这样行不行。 random.sample 上的文档不太清楚,尽管它提到 xrange 非常快——这让我相信它可能会起作用。将数组创建转换为生成器需要一些工作(我对生成器的了解很生疏),所以我想提前知道这是否可行。 :)

我能看到的另一种方法是通过 xrange 进行随机抽样,并且只生成那些实际由索引选择的对象。但这不是很干净,因为生成的索引是任意的和不必要的,而且我需要相当复杂的逻辑来在我的 generateHugeArray 方法中支持它。

对于奖励积分:random.sample 实际上是如何工作的?特别是,如果它事先不知道人口的规模,就像 xrange 这样的生成器,它如何工作?

最佳答案

似乎没有办法避免弄清楚索引如何映射到您的排列。如果你不知道这一点,你将如何从你的数组中创建一个随机对象?您可以使用您自己建议的 xrange() 来使用技巧,或者实现一个定义 __getitem__()__len__() 方法的类,并且将此类的对象作为 population 参数传递给 random.sample()

一些进一步的评论:

  • 将 createHugeArray() 转换为生成器不会给您带来任何好处——random.sample() 将不再起作用。它需要一个支持 len() 的对象。

  • 所以它确实需要从一开始就知道总体中元素的数量。

  • implementation具有两种不同的算法,并选择使用较少内存的算法。对于相对较小的 k(即,在手头的情况下),它将简单地保存已经在 set 中选择的索引,并在它命中其中一个时做出新的随机选择他们。

编辑:一种完全不同的方法是对所有排列进行一次迭代,然后决定是否应包括每个排列。如果排列总数为 n,而您想从中选择 k,您可以这样写

selected = []
for i in xrange(n):
perm = nextPermutation()
if random.random() < float(k-len(selected))/(n-i):
selected.append(perm)

这会随机选择 k 个排列。

关于python - 在 python 中延迟抽取随机结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4286862/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com