Я выполняю запрос 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
.Я просто хочу подтвердить, что это никак нельзя оптимизировать, прежде чем двигаться дальше.