Почему 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")
Вернуться на верх