Hello I made a code to make it irregular.
Can someone tell me why prefetch is faster when the prediction should be faster?
annotate test:
execution time: 6.65 seconds
prefetch test:
execution time: 3.02 seconds
@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")
Here is prefetch code
@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")