我正在执行GET请求,以从Django rest框架API返回大约100,000个对象。该请求的完成速度稍慢(将近2秒),并且在进一步检查后,缓慢的部分正在存储serializer.data
的结果。
总响应大小为<5MB,因此我希望响应时间比这要快得多。通过在线阅读各种文章,大多数“ Django速度慢问题”似乎都源于N + 1问题,可以使用prefetch_related
轻松解决,但这似乎与我的问题无关,因为我的模型没有任何外来因素键。
我已经使用django-extensions
的{{1}}来查看Django在做什么。但是,当我为各个段计时时(如下面的代码块所示),实际的查询和序列化步骤几乎是即时的。确实,runserver --print-sql
显示的查询是明智的。
我也查看了Django's serializers的来源,但是对于django-extensions
步骤可能需要这么长时间的原因,我仍然不明智。
有问题的GET请求(包括时序语句)如下:
.data
使用以下序列化器:
class ExampleList(generics.ListCreateAPIView):
queryset = Example.objects.all()
serializer_class = ExampleSerializer
def get(self, request):
start_time = time.time()
queryset = Example.objects.all()
query_time = time.time() - start_time
print('Query time: {}'.format(query_time))
start_time = time.time()
serializer = ExampleSerializer(queryset, many=True)
serialization_time = time.time() - start_time
print('Serialization time: {}'.format(serialization_time))
start_time = time.time()
to_return = serializer.data
serializer_data_time = time.time() - start_time
print('Serialization data time: {}'.format(serializer_data_time))
return Response(to_return)
以及以下模型:
class ExampleSerializer(serializers.ModelSerializer):
class Meta:
model = Example
fields = '__all__'
运行此GET请求的输出如下:
class Example(models.Model):
title = models.TextField()
number = models.IntegerField()
我猜想这可能实际上是无法加速的,因为在Query time: 0.0
Serialization time: 0.0
Serialization data time: 1.8892838954925537
步骤中可能要从ListSerializer转换为ReturnList的对象很多。我只想确认在继续操作之前无法以任何方式进行优化。