Почему шаг Django serializer.data медленный? - PullRequest
0 голосов
/ 25 мая 2019

Я выполняю запрос GET, чтобы вернуть около 100 000 объектов из моего API-интерфейса остальных компонентов Django.Запрос выполняется довольно медленно (почти 2 секунды), и при дальнейшей проверке медленная часть сохраняет результат serializer.data.

Общий размер ответа <5 МБ, поэтому я ожидаю, что время ответабыть намного быстрее, чем это.Из-за чтения различных статей в Интернете, большинство «проблем с медлительностью Django», похоже, проистекают из проблемы N + 1, которую легко решить с помощью <code>prefetch_related, но это, похоже, не относится к моей проблеме, так как моя модель не имеет внешнего ключа.

Я использовал django-extensions runserver --print-sql, чтобы посмотреть, какие запросы выполняет Django.Но когда я синхронизирую отдельные сегменты (как показано в блоке кода ниже), реальные шаги запроса и сериализации практически мгновенны.Действительно, запрос, который показывает django-extensions, является разумным.

Я также посмотрел на источник для сериализаторов Django , но я все еще не знаю, почему шаг .data можеттак долго.

Запрос GET (включая операторы синхронизации) выглядит следующим образом:

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__'

Иследующая модель:

class Example(models.Model):
    title = models.TextField()
    number = models.IntegerField()

Результат выполнения этого запроса GET выглядит следующим образом:

Query time: 0.0
Serialization time: 0.0
Serialization data time: 1.8892838954925537

Я предполагаю, что это может быть что-то, что на самом деле не может быть ускоренотак как 100 000 объектов, возможно, очень много для преобразования из ListSerializer в ReturnList на шаге .data.Я просто хочу подтвердить, что это никак нельзя оптимизировать, прежде чем двигаться дальше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...