Почему Prefetch работает лучше, чем аннотации в django?
Здравствуйте, я сделал код, чтобы сделать его нерегулярным. Может ли кто-нибудь сказать мне, почему префетч быстрее, когда предсказание должно быть быстрее?
Аннотируйте тест: время выполнения: 6,65 секунды
Тест предварительной выборки: время выполнения: 3,02 секунды
@transaction.atomic()
def set_default_like_place_annotate(start, end):
start_time = time.time()
print(f"Start time: {start_time}")
place_query = Place.objects.filter(removed_at__isnull=True).annotate(
exist_liking_count=models.Count('place_likers', filter=Q(place_likers__removed_at__isnull=True)))[start:end]
for place in place_query:
place.liking_count = place.exist_liking_count
place.save()
end_time = time.time()
elapsed_time = end_time - start_time
print(f"execution time: {elapsed_time:.2f} seconds")
Вот код предварительной выборки
@transaction.atomic()
def set_default_like_place_prefetch(start, end):
start_time = time.time()
print(f"Start time: {start_time}")
place_query = Place.objects.filter(removed_at__isnull=True).prefetch_related(
models.Prefetch(
'place_likers',
queryset=LikingPlace.objects.filter(removed_at__isnull=True),
to_attr='_place_likers',
))[start:end]
for place in place_query:
place.liking_count = len(place._place_likers)
place.save()
end_time = time.time()
print(f"End time: {end_time}")
print(f"execution time: {end_time - start_time:.2f} seconds")