我使用random.sample
取决于输入负载从一个非常大的范围内采样。有时样本本身非常大,因为它是一个列表,它占据了大量的记忆。python是否有内置的方式来返回一个列表生成器,而不是从random.sample的列表
该应用程序不一定使用列表中的所有值。 如果random.sample
可以返回列表生成器而不是列表本身,那将是非常好的。
现在我有一个包装,它将大输入范围划分成相同大小的桶,并使用randint
从每个n/sample_size
桶中选择一个随机数。
编辑:在我的情况下输入是连续的,我有这个包装函数来模拟random.sample作为一个生成器,但这不是真正的复制功能,因为它在最后跳过一些元素。
import random
def samplegen(start, end, sample_size):
bktlen = (end - start)/sample_size
for i in xrange(sample_size): #this skips the last modulo elements
st = start + (i * bktlen)
yield random.randrange(st, st + bktlen)
要做'random.sample'作为一个生成器,你必须跟踪你已经放弃的项目,所以你可以避免再次使用它们。这将使用与返回列表一样多的内存。 – kindall
@ kindall这就是为什么我将输入范围拆分为桶并从每个桶中仅选择一个数字,并且桶的数量基于样本大小。我应该提到输入是连续范围的数字,如xrange(0,1000000) – user881300
@ user881300'xrange(0,1000000)'的random.sample是如何产生问题的?这并不大。 –