2024-04-20 11:29:46 发布
网友
myqueryset = Content.objects.filter(random 100)
我知道:
import random object_list = list(Content.objects.filter(foo=bar).values()[:100]) random.shuffle(object_list)
只运行一个简单的MySQL查询,性能良好。
Content.objects.all().order_by('?')[:100]
请参阅order_by docs。还要注意,这种方法的伸缩性不好(事实上,它的伸缩性非常,非常差)。当您有大量数据时,请参阅this SO answer以获得处理随机选择的更好方法。
如果要多次执行此操作,则需要将其设计到数据库中。
如果你只做一次,你可以付得起高额的罚款。这可以得到100个非常好的随机特性。但是,它使用了大量的内存。
pool= list( Content.objects.all() ) random.shuffle( pool ) object_list = pool[:100]
这是另一个算法,也有点慢,因为它可能搜索整个表。它根本不需要太多的内存,而且可能得不到100。
total_count= Content.objects.count() fraction = 100./total_count object_list = [ c for c in Content.objects.all() if random.random() < fraction ]
如果要多次执行此操作,则需要向内容添加一个属性,以便对“随机”值进行有效筛选。例如,您可以这样做。
class Content( models.Model ): ... etc. ... def subset( self ): return self.id % 32768
这将把数据划分成32768个不同的子集。每个子集是数据的1/32768。要获得100个随机项,需要100*32768/数据的总数子集。
total_count = Content.objects.count() no_of_subsets= 100*32768/total_count object_list = Content.objects.filter( subset__lte=no_of_subsets )
这是快速的而且是可重复的。子集是“任意的”,而不是技术上的“随机的”。
我知道:
只运行一个简单的MySQL查询,性能良好。
请参阅order_by docs。还要注意,这种方法的伸缩性不好(事实上,它的伸缩性非常,非常差)。当您有大量数据时,请参阅this SO answer以获得处理随机选择的更好方法。
如果要多次执行此操作,则需要将其设计到数据库中。
如果你只做一次,你可以付得起高额的罚款。这可以得到100个非常好的随机特性。但是,它使用了大量的内存。
这是另一个算法,也有点慢,因为它可能搜索整个表。它根本不需要太多的内存,而且可能得不到100。
如果要多次执行此操作,则需要向内容添加一个属性,以便对“随机”值进行有效筛选。例如,您可以这样做。
这将把数据划分成32768个不同的子集。每个子集是数据的1/32768。要获得100个随机项,需要100*32768/数据的总数子集。
这是快速的而且是可重复的。子集是“任意的”,而不是技术上的“随机的”。
相关问题 更多 >
编程相关推荐