Python/파이썬 기초

파이썬 len 함수 총정리 : 자료형별 길이 정의, 시간 복잡도, 클래스 내 __len__ 구현

jimmy_AI 2022. 5. 5. 21:43
반응형

Python length 반환 함수(len) 설명

파이썬에서 특정 자료의 길이(혹은 원소의 개수)를 손쉽게 조회할 수 있는 len 함수에 대하여

자료형별 len 값의 구성 비교와 실행 시 시간 복잡도, 그리고 직접 구현한 클래스 내에서

len 함수를 사용할 수 있도록 만드는 방법에 대하여 살펴보도록 하겠습니다.

 

 

자료형별 len 값 구성 예시

len 함수는 기본적으로 해당 자료의 길이라고 대표할 수 있는 값을 반환합니다.

 

예를 들어,

리스트, 튜플, 집합에서는 포함하고 있는 원소의 개수를 길이로 정의하며,

딕셔너리에서는 key-value pair의 개수, 문자열에서는 구성된 문자의 개수로 정의합니다.

# 리스트, 튜플, 집합 -> 원소의 개수
print(len([1, 2, 3])) # 3
print(len(('a', 'b', 'c', 'd'))) # 4
print(len(set([1, 1, 3, 3 ,5]))) # 3

# 딕셔너리 -> key-value pair의 개수
print(len({'a' : 1, 'b' : 2})) # 2

# 문자열 -> 문자의 개수
print(len("abcde")) # 5

 

또한, numpy 배열이나 pytorch의 텐서와 같은 특수한 자료형도 길이를 가지는데,

여기서는 첫 번째 축의 shape로 len 값을 정의하고 있습니다.

import numpy as np
import torch

# 넘파이 배열, 파이토치 텐서 -> 첫 번째 축의 shape
print(len(np.array([1, 2, 3, 4]))) # 4
print(len(np.array([[1, 2, 3], [4, 5, 6]]))) # 2
print(len(torch.ones(3, 4, 5))) # 3

 

이 외에도 판다스의 Series와 DataFrame 자료형에서는 행의 개수로 길이를 정의하는 등

다른 특수 자료형에서도 해당 자료의 길이를 대표할 수 있는 값으로 len 값을

나타내고 있음을 알 수 있습니다.

반응형

len 함수 시간 복잡도 : O(1)

len 함수는 일부 특수 자료형에서는 다를 수도 있겠지만

일반적으로는 자료 개수에 관계 없이 O(1)이라는 효율적인 시간복잡도를 나타냅니다.

 

아래는 자료가 각각 100만 개와 1억 개인 리스트에 대하여

1만번씩 len 연산을 수행한 시간을 비교한 결과입니다.

import time

x = [1] * (10 ** 6)
y = [1] * (10 ** 8)

# 자료형 100만 개인 리스트 10000번 len 수행
start = time.time()
for i in range(10000):
    z = len(x)
end = time.time()
print(end - start) # 약 0.003초

# 자료형 1억 개인 리스트 10000번 len 수행
start = time.time()
for i in range(10000):
    z = len(y)
end = time.time()
print(end - start) # 약 0.003초

둘 다 1만번 len 실행에 불과 0.003초 정도 밖에 걸리지 않은 효율적인 결과를 보여주었고,

이로써 실험적으로 O(1)에 가까운 시간 복잡도임을 체감해볼 수 있었습니다.

 

 

클래스 선언 시 len 함수 구현 : __len__ 메소드

직접 구현한 class 객체에 대하여 len 함수를 구현하고 싶다면

__len__ 메소드 내에서 원하는 길이 대표값을 return해주시면 됩니다.

 

예를 들어, 두 개의 리스트 자료를 속성을 가지는 Two_list 클래스에 대하여

두 리스트의 길이 합계를 Two_list 객체 길이의 대표값으로 사용하고 싶다면

아래 예시 코드처럼 구현해볼 수 있습니다.

class Two_list:
    def __init__(self, first_list, second_list):
        # 첫 번째 리스트, 두 번째 리스트를 속성으로 가짐
        self.first_list = first_list
        self.second_list = second_list

    def __len__(self):
        return len(self.first_list) + len(self.second_list) # 대표 길이 : 두 리스트의 길이 합계

# 첫 번째 리스트 : 길이 5, 두 번째 리스트 : 길이 2
tl = Two_list([1, 2, 3, 4, 5], [1, 2])
print(len(tl)) # 7(대표 길이)