728x90
dict를 통해서 총 갯수를 구하는 total_count를 구현 중에 문득 len()은 db히트가 더 작은데 왜 시간이 더 느릴까에 대해 고민을 하게 됬다.
- django는 count() 메서드를 특별한 방시긍로 최적화하고
- len()을 사용하면 QuerySet을 강제로 평가해서 필요하지 않은 경우에도 전체 결과를 가져오고
- count()는 SQL의 COUNT 집계 함수를 사용해서 빠르게 결과를 가져오기 떄문에 count가 더 빠르다
아래는 우리 gpt 형님의 답변입니다
두 가지 방법을 비교하여 어떤 것이 "좋다"는 것은 맥락에 따라 다를 수 있습니다. 그러나 주로 Django의 QuerySet에는 count() 메서드가 이미 내장되어 있으므로 len() 함수 대신 count() 메서드를 사용하는 것이 더 효율적인 선택일 수 있습니다. 여기에는 몇 가지 이유가 있습니다:
- QuerySet Optimization: Django의 QuerySet은 count() 메서드를 특별한 방식으로 최적화할 수 있습니다. 예를 들어, 쿼리가 디비에 이미 수행되었다면, count() 메서드는 해당 결과를 가져오기 위한 별도의 쿼리를 수행하지 않고 저장된 총 개수를 반환합니다.
- Lazy Evaluation: Django QuerySet은 "게으른 평가"를 지원합니다. 즉, 필요한 경우에만 데이터베이스 쿼리를 실행합니다. len() 함수를 사용하면 QuerySet을 강제로 평가하게 되므로, 필요하지 않은 경우에도 전체 결과를 가져오게 됩니다.
- Performance: count() 메서드는 SQL의 COUNT 집계 함수를 사용하여 빠르게 결과를 가져옵니다. 반면에 len() 함수는 QuerySet을 리스트로 변환하여 모든 객체를 가져온 후에 길이를 계산하므로 성능이 저하될 수 있습니다.
따라서 일반적으로 proposal.count()를 사용하는 것이 더 효율적입니다. 단, 이 문맥에서 proposals가 이미 리스트로 평가된 경우에는 len(proposals)를 사용하는 것이 더 적합할 수 있습니다. 하지만, 일반적으로는 QuerySet에 대해서는 count() 메서드를 선호하는 것이 좋습니다.
'Django > orm' 카테고리의 다른 글
Django date range (0) | 2024.02.01 |
---|---|
F() (0) | 2024.01.24 |
두 가지 조건을 exclude 시 and 연산 (0) | 2024.01.17 |
검색 기능 splite기능 annotate만들어서 사용 (2) | 2024.01.02 |
Django Model (0) | 2023.12.19 |