일반적으로 count를 쓰는 것이 len을 사용하는 것보다 성능적으로 우월하다고 한 것으로 알고 있었다.
근데, 나는 len으로 바꿔달라는 리뷰를 받았다.
왤까 싶어서 검색을 해봤다.
len()과 count() 차이
count()와 len()은 둘 다 객체의 개수를 계산하는 데 사용되는 메서드이다.
그러나 성능 측면에서는 약간의 차이가 있다.
count() 메서드는 SQL 쿼리를 실행하여 데이터베이스 내에서 개수를 직접 계산한다.
이는 데이터베이스에 대한 추가적인 쿼리를 실행해야 하므로 일부 성능 부하가 발생할 수 있다.
특히 데이터베이스에 많은 레코드가 있는 경우에는 성능 저하가 더 크게 나타날 수 있다.
반면에 len() 함수는 count()와 달리 Python 메모리 상에서 객체의 길이를 계산한다.
따라서 데이터베이스에 대한 추가적인 쿼리가 필요하지 않으므로 일반적으로 count()보다 빠를 수 있다.
그러나 객체가 메모리에 로드되어 있어야 하므로, 만약 객체가 아직 로드되지 않은 상태라면
len()을 호출하기 전에 데이터베이스에서 객체를 가져와야 한다.
다시 설명하자면, 아직 로드되지 않은 상태에서는
len()으로 count()를 대신하려하면 fetch를 하면서 시간이 O(N)이 걸리고
이 결과를 웹서버의 memory에 담으면서 storage에 O(N)이 발생하며 복사하는 시간이 걸려 time에도 O(N)이 추가로 발생한다.
거기에 추가적으로 len()이 돌아가는 시간도 발생한다.
이 두 과정은 인프라에 따라 다르겠지만 count()가 2배정도 빠르다고 한다.
성능 측면에서 count()가 len()보다 우월하다고 말하기는 어렵다.
두 방법 모두 상황에 따라 성능 차이가 발생할 수 있기 때문이다.
요약하자면,
일반적으로 객체 개수를 확인하는 용도로는 count()를 사용하는 것이 가장 직관적이고 안전한 방법이다.
len()은 객체가 이미 로드되어 있을 때나 객체 개수가 적을 때 유용할 것이다.
하지만, 성능적으로 그렇게 차이가 나지 않으므로 회사 내의 코드 스타일을 우선으로 하고
그 다음에 상황을 판단해서 사용하도록 하자.
예시
def test():
queryset = User.objects.all()
# 뭔가 작업을 하고
lst = [p for p.id in queryset]
...
# qs의 개수를 얻을 때.
len(queryset)
객체가 이미 메모리에 로드되어 있었기 때문에 len을 사용했다.
참고
'Python > django' 카테고리의 다른 글
UniqueConstraint (0) | 2023.06.21 |
---|---|
get_object 메서드 (0) | 2023.06.20 |
Django OneToOne Field 사용 지양하는 이유 (0) | 2023.05.24 |
Django Migration 사용 안하고 DDL 사용하기(2) (0) | 2023.05.17 |
Django Migration 사용 안하고 DDL 사용하기(1) (1) | 2023.05.16 |