Data science/Python

0. Python 이란?: 언어형태, 특징, 메모리관리

연금(Pension)술사 2019. 6. 16. 15:12






파이썬은 컴파일 언어인가? 인터프리터 언어인가?



 컴퍼일 언어는 원시코드를 컴파일이라는 과정을 통해 기계여로 번역한 파일을 만들고, 만든 파일만을 가지고 파일을 통해 실행시킨다. 즉실행파일만 미리 만들어두는 것이다. 그러나, 컴파일 과정이 오래걸리고, 실행시키는 컴퓨팅 환경에 많이 영향을 받지만, 컴파일 파일(실행파일)만 있으면 되니까, 매우 빠른 속도로 실행될 수 있다. 

 예) C, C++


 인터프리터 언어


 - 인터프리터(해석기)에 의해서 원시 소스코드(진짜 코드)를 한 줄씩 읽어 실행하는 언어이다. 즉 Line by Line으로 읽을 수 있다.

 - 컴파일 언어보다 더 느리게 실행된다. 이는 미리 컴파일 시켜놓아, 바로 실행되는 형태가 아니기 때문이다.

 - 장점으로는, 코드를 빠르게 실행시켜볼 수 있고, 대화식(내가 입력하면서, 컴퓨터가 바로 출력하는 형태)로 코드를 개발 할 수 있기에, 교육용으로 사용되는 경우가 많다.

 - 예, Python, JavaScript, PHP





파이썬 개요 및 특징


파이썬은 1989년 귀도 반 로섬에 의해 개발되었다.


특징으로는 다음과 같다

    • 플랫폼 독립적: 이는 어느 운영체제 관계없이, 또는 PC, 모바일등과 같이 다른 환경에서 사용 가능하다는 의미이다. 
    • 인터프리터식: Line by line + 대화식으로 사용가능
    • 객체지향적: 자료형을 숫자, 문자, 자료구조들을 파이썬 객체라고하는 어떤 상자안에 저장된 형태로 만들어 사용
    • 동적 타이핑 대화형언어(dynamically typed): 예를 들어, 변수 A를 문자형으로 지정했다고 하고, 이를 숫자형으로 마음대로 바꿀 수 있다. 다른 언어들은 미리 메모리 공간을 잡아 놓기 때문에, 변수의 형태를 마음대로 변경하는것을 지원하지 않는다. (=This implies that dynamic typed languages do not require the explicit declaration of the variables before they’re used) [1]
    • 기본 제공하는 함수(기능)은 거의 없고, 대부분 많은 기능이 라이브러리로 구성됨


요약하자면, 가독성(문법 간결), 확장성(라이브러리), 접착성(C로 구현된것도 쉽게 만들어 붙일 수 있음, 반대도 가능), 유니코드, 동적타이핑(동적언어 + 인터프리터 언어)




파이썬의 메모리관리: 저수준컴퓨팅 ~ 가비지 컬렉션 & 레퍼런스 카운팅


파이썬의 뒷단에는 내가 지정한 변수들을 어떻게 관리하고, 메모리를 어떻게 할당/관리하는지에 대하 설명이다. [2]저수준(Low-level computing) 컴퓨팅과, 파이썬에서의 저수준 컴퓨팅, 내부 메모리 관리 알고리즘에 대해 추가적인 이해를 하고 싶다면, 본 섹션을 참고하길 바란다.

 우선, 우리가 A4용지내에 수학문제를 풀고자한다면, 변수와 공식들을 써내려가면서 문제를 풀고자 할것이다. 이처럼 메모리 자체를 어떤 공책이라고 생각하면 편하다. 메모리(A4노트, 또는 책)에 변수를 지우개로 지워서 다시쓸수도있고, 더 추가적으로 쓸수도 있고, 내가 갖고있는 공책(메모리)가 부족할 수도있다. 그러나, 우리는 노트 장 수가 한정적이기 때문에 메모리 관리에 대해 배울 필요도 있다. 또한, 여백의 A4공간을 어떻게 공식을 써내려갈지도 고민해야한다. 다행히 히는 파이썬에서 알아서 해준다.



CPython?

우선, 파이썬 기본 실행(Default Python Implementation)는 CPython이라는 C로 써진 것인데, pyc파일 이나 pycache 폴더를 본적 이 있다면, 이는 bytoecode로 가상환경에서 인터프리팅된것이다. CPython도 있고, IronPython(MS에서 다운)도 있고, Jypthon도 있고.. 여러가지가 있다. 우선 여기서는 CPython에서도만 이야기하자면, Cpython은 위에서 언급했듯이 C로 쓰여진것이고, 파이썬 bytecode을 인터프리팅 하는 실행계획 같은거다. 이 CPython에 메모리 관리에 필요한 구조와 알고리즘 코드가 들어있다. 따라서, 파이썬의 메모리 관리를 알고자한다면, 우리는 CPython에 대해 좀더 이해를 한다.


CPython도 역시 객체로 구성되어있는데, (예를 들어, 파이썬에 string type)같은 것이다. PyObject라고 불린다. 이 PyObejct는 모든 파이썬 객체의 조부모에 해당하는 객체인데 Ob_refcnt, ob_type을 포함하는데 이에 해당하는 설명은 다음과 같다.

  • ob_refcnt: 레퍼런스 수(Reference count)
  • ob_type: 포인터(다른 타입을 지정하는 포인터)

레퍼런스 카운터는 가비지 콜렉터(Garbage collection)에 사용되고, pointer는 실제 오브젝트의 타입을 가리키는데 사용된다. 오브젝트 타입은 파이썬 오브젝트에서 사전형(dict)s나 숫자(int)형과 같은 것을 설명하기위한 구조이다.


Carbage collection(가비지 콜렉터)

다시 A4 용지에 수학문제를 풀고자한다고 생각해보자. 임의로 변수 X에 대해서 식을 풀어쓰다가 Z가 필요해서 써내려갔다. 그런데 사실 Z는 안쓰게되서 A4 한구석에 Z라고만 써놓기만했다면, 수식에서는 전혀 쓸모가 없기때문에, Z를 지워도 무관할 것이다. 이와 같이, 파이썬 코드내에서 언급이 되지 않는(Unreferenced) 객체들은 지워야하는데, 이럴 때 Reference count가 0인 경우에 그 파이썬 객체를 삭제하게 된다. 레퍼런스 카운트에 대해서 조금 더 자세한 예를 들면, 아래와 같다.


1
2
3
4
5
6
7
ref = [5,6,7]
# ref 객체가 5,6,7을 가르키고 있기 때문에, 레퍼런스 카운트가 1이다
my_ref = ref
# 또한, my_ref가 ref의 주소를 가리키지만, 이는 사실 [5,6,7]을 가르키기 때문에 레퍼런스 카운트가 2이다.
 
my_sum = sum(my_ref)
# 이렇게 원래 주소값이 있던 것을 계속 참조하게되면, 레퍼런스 카운트가 올라간다.
cs

객체 ref가 [5,6,7]을 직접 저장하고 있는것이 아니라, 주소값만 가지고 [5,6,7]을 가르키고 있는 것이다. 그렇기 때문에 이에 대한 레퍼런스카운드가 1이다. 3번라인은 my_ref객체가 ref객체를 가르키는 것처럼보이지만, 사실은 ref가 가지고있는 [5,6,7]에 대한 주소를 가르키기 때문에 my_ref 도 [5,6,7]을 가르키는 주소값만 가지고 있다. 즉 1번과 3번라인의 주소값이 동일하게 가르키고 있기 때문에 레퍼런스 카운트가 2이다. 이는 id(ref) 와 id(my_ref)을 출력해보면 동일한 주소값을 가지고 있음을 알 수 있다. 또한 6번라인처럼, 이전에 주소값에다가 연산을 또 하면 레퍼런스 카운트가 증가한다. 이처럼 레퍼런스 카운트가 증가하는 반면, 필요가 없는 경우 삭제되는데, 레퍼런스 카운트가 0이 되는 경우 변수를 삭제한다.


CPython의 메모리 관리 

Python Carbage collection, reference counting 썬 [작성중]..



[3]


반응형