파이썬 알고리즘

자료형, 자료구조, 추상 자료형

Suhd 2023. 4. 18. 22:14

자료형

리스트(List)와 딕셔너리(Dictionary)에 대해 중점적으로 살펴본다.

파이썬 자료형


None

class None Type

숫자

정수형

  • 정수 ( class int )

    • 파이썬에서는 숫자 정수형으로 int만을 제공

    • int는 임의 정밀도를 지원(무제한 자릿수 제공)

      ⇒ 정수를 숫자의 배열로 간주해서, 자릿수 단위로 쪼개어 배열 형태로 표현한다.

      이후, 나중에 사용할 때 모두 더하여 사용한다.

      ⇒ 숫자를 임의 정밀도로 처리하면 계산 속도가 저하되지만

    1. 숫자를 단일형(int 하나)로 처리할 수 있고

    2. Overflow를 고려할 필요가 없어 잘못된 계산 오류를 방지할 수 있음.

      ⇒ 기능을 위해 속도를 희생

  • 불리언 ( class bool )

bool은 엄밀히 따지면 논리 자료형이지만,

파이썬 내부적으로 1(True)와 0(False)로 처리되는 int의 서브클래스

int는 Object의 하위 클래스이기도 함

object > int > bool

논리 자료형 값인 True와 정수형 값인 1을 비교

>>> True == 1
True
>>> False == 0
True

실수

class float

집합형

집합 ( class set )

: set은 중복된 값을 갖지 않는 자료형

>>> a = {3,2,3,5}
>>> a
{2,3,5}

매핑

딕셔너리 ( class dict )

: key와 value로 구성된 복합 자료형

시퀀스

불변

  • 문자열 ( class str )

“str 변수는 값을 변경할 수 있는 것 아닌가? ”

>>> a = 'abc' 
>>> a = 'def'
>>> print(a)
'def'
>>> type(a)
<class 'str'>

a 변수는 다른 str 타입인 def를 참조했을 뿐, str값은 그대로 존재함

>>> a='abc'
>>> a='def'
>>> id('abc') == id('def')
False

실제로 str를 바꾸려면 오류가 난다

>>> a[1]='d' => 오류!
  • 튜플 ( class tuple )
  • 바이트 ( class bytes )

가변


원시 타입


메모리에 정확하게 타입 크기만큼의 공간을 할당하고

그 공간을 오로지 값으로 채워넣기에 적은 공간을 차지하고 빠른 속도를 제공한다.

하지만 원시 타입에 대응되는 객체를 만들어 사용하면

다양하고 편리한 기능을 사용할 수 있다.

그만큼 공간을 많이 차지하며 속도가 느려진다.

하지만, 파이썬은 속도보다는 편의성을 추구하기 때문에 객체 자료형만 지원한다.

언어 지원 타입 형태
C 원시 타입
자바 원시 타입, 객체
파이썬 객체

객체


파이썬은 모든 것이 객체, 심지어 문자와 숫자도 모두 객체

불변 객체와 가변 객체로 나눌 수 있음

파이썬에서 변수를 할당하는 작업은

해당 객체에 대해 참조를 한다는 의미

  • 불변 객체

bool, int, float, tuple, str

⇒ 값이 변하지 않기에 dict의 key나 set의 값으로 사용할 수 있다.

  • 가변 객체

list, set, dict

다른 변수가 참조하고 있을 대, 그 변수의 값 또한 변경된다는 얘기

>>> a=[1,2,3,4,5]
>>> b=a
>>> b
[1,2,3,4,5]
>>> a[2] = 4
>>> a
[1,2,4,4,5]
>>> b
[1,2,4,4,5]

속도


  • 원시 타입

단순 정수형의 덧셈 연산을 하는 경우에도

메모리에서 값을 꺼내 한번 연산하면 끝

  • 객체

값을 꺼내는 데만 해도 여러단계의 부가 작업이 필요 ⇒ 시간이 오래 걸림

하지만, 파이썬의 Numpy는 빠른 속도를 제공하는데

이는 C로 만든 모듈이며 내부적으로 리스트를 C의 원시 타입으로 처리한다고 한다.

timeit 함수에 대해

import timeit

# 원하는 코드 함수화
def my_code():
    for i in range(10 ** 6):
        pass

# 시간 측정
%timeit my_code()
# 10 loops, best of 5: 23.5 ms per loop

%timeit -n 100 my_code() # 100번 돌린 평균 계산 시간

추가 내용


'파이썬 알고리즘' 카테고리의 다른 글

딕셔너리  (0) 2023.04.18
파이썬 리스트 구조  (0) 2023.04.18
빅 오 표기법  (0) 2023.04.18
파이썬 문법 기본  (0) 2023.04.18