为什么Django serializer.data步骤缓慢?

时间:2019-05-25 17:22:20

标签: django serialization django-rest-framework

我正在执行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的对象很多。我只想确认在继续操作之前无法以任何方式进行优化。

0 个答案:

没有答案