상세 컨텐츠

본문 제목

[python]튜플, 왜 쓰는걸까?

언어/Python

by moonionn 2021. 3. 18. 11:01

본문

 

튜플의 생김새는 아래와 같습니다.

data = (1,2)

 

가장 흔하게 볼 수 있는 생김새는

다른 자료구조 내부에 element로 포함된 모양새입니다.

data = [(1,2), (2,3), (3,4)]

 

그런데 왜 이 튜플 타입을 사용해야 하는걸까요?

튜플 대신 리스트 타입을 써도 괜찮아 보이는데요,

심지어 튜플은 내부 element 내용을 변경할 수도 없습니다!

# 이렇게 하면 안되는 걸까?
data = [[1,2], [2,3], [3,4]]

 

 튜플이 필요한 이유

결과부터 말하자면 튜플이 필요한 이유는, 튜플은 리스트와 비교해서

더 메모리용량을 아끼고 퍼포먼스를 향상시키는데 도움이 되기 때문입니다.

 

리스트는 비교적 무겁다

파이썬의 리스트는 다른 언어(ex: C 언어)의 자료구조 중

배열(array) 타입과 연결 리스트(linked list)의 기능을 합한 것과 유사합니다.

 

이를 이해하기 위해서는 파이썬의 작동방식을 알아야 합니다.

간단하게 설명하자면 파이썬은 C 언어로 구현되어 있습니다.

 

그 중간과정에 CPython이라는 구현체가 있는데 

이 CPython이 python을 컴파일하고 실행합니다.

(.py를 실행하면 .pyc 파일이 생성됩니다)

 

C 언어에서는 배열을 선언할 때 그 크기를 지정하고

해당 크기만큼의 연속된 메모리 공간만을 할당받습니다.

한 번 생성한 배열의 크기는 변경이 불가능합니다.

// C 언어

// 정수형 요소 3개로 이루어진 배열 생성
int arr[3] = {1,2,3};

 

물론 배열의 크기를 조정할 수 없는 건 너무 불편하기 때문에

대부분의 동적 프로그래밍 언어에서는 동적 배열 타입을 따로 제공합니다.

파이썬에서는 리스트가 그 역할을 맡습니다.

 

무거운 이유1: 동적 배열

동적 배열은 미리 초깃값을 최소한으로 잡아 배열을 생성합니다.

데이터가 추가되면 배열을 늘려줍니다.

보통 배열이 꽉 찼을 때 새 데이터를 추가하려 하면

배열의 사이즈를 더블링(doubling) 해줍니다.

 

CPython에서는 리스트의 크기를 아래와 같이 늘리도록 정의되어 있습니다.

// The growth pattern is: 0, 4, 8, 16, 25, 35, 46, 58 ...

// 초반에만 크게 늘려가고 점차 확대폭을 줄여갑니다.

new_allocated = (size_t)newsize + (newsize >> 3) + (newsize < 9 ? 3 : 6);

 

파이썬으로 아래처럼 

4개의 int element를 가진 리스트를 선언하면

메모리에서 4개의 int 사이즈만큼만이 할당됩니다.

# 파이썬

data = [1,2,3,4]

 

여기서 리스트에 데이터를 더 추가하려 하면

아래와 같은 과정을 거칩니다.

 

무거운 이유2: 리스트는 가변, 튜플은 불변

리스트는 가변객체이기 때문에 튜플보다 오버헤드가 큽니다.

자세한 내용은 저번 포스트에서 다룬

가변객체와 불변객체 포스트에서 설명되어 있습니다.

 

 

위와 같은 이유들로 인해 

값이 고정되어 있거나, 비교적 작은 크기의 공간을 필요로 하는 데이터를 쓴다면

리스트보다 튜플을 쓰는 것이 퍼포먼스를 높이는 데 도움이 됩니다.

예를 들면 그래프의 좌표값같은 경우,

리스트를 쓰는 것보다 튜플을 쓰는 것이 훨씬 간편하겠죠?

그래프의 좌표 (coord)

관련글 더보기

댓글 영역