Django 查询集上的 random.sample:查询集上的采样将如何影响性能?

Jun*_*une 7 python django

我试图从我的查询集中采样一些记录以提高性能,例如:

from random import sample
from my_app import MyModel


my_models = MyModel.objects.all()

# sample only a few of records for performance
my_models_sample = sample(my_models, 5)

for model in my_models_sample:
    model.some_expensive_calculation
Run Code Online (Sandbox Code Playgroud)

但我觉得它只会在执行时间方面变得更糟。

random.sample()幕后的实际工作如何?它会不会对 django 查询集造成相当大的性能负担?

ozg*_*gur 6

由于random.sample()将强制评估 queryset my_models,程序的执行时间将在很大程度上取决于MyModel数据库中的对象总数。

为了提高性能,并避免加载整个查询集到内存中,你可以描述最终实现自己的采样功能在这里一起.iterator()的方法。

或者,您也可以依靠数据库服务器通过order_by('?')以下方式为您进行采样:

MyModel.objects.order_by('?')[:5]
Run Code Online (Sandbox Code Playgroud)

就我个人而言,我不推荐后者,因为查询可能既昂贵又缓慢,具体取决于您使用的数据库后端。(特别是对于 MySQL)