상세 컨텐츠

본문 제목

python의 특징 / python 동작 순서 / python 메모리 관리

카테고리 없음

by hunss 2023. 1. 17. 21:34

본문

python의 특징과 장단점

1. 파이썬은 스크립트 언어로 컴파일 과정없이 인터프리터에 의해 실행 결과를 바로 확인하고 수정하며 코드를 작성.

(컴파일 = 인간이 작성한 코드를 컴퓨터가 이해할 수 있도록 binary code로 번역하는 과정)

2. 동적 타입 언어로 변수의 자료형을 지정하지 않아도 됨.

  • python에서는 인터프리터가 코드를 실행하면서 타입을 추론하여 체크함. 그래서 python에서 변수의 타입은 고정되어 있지 않기 때문에 개발자가 원하면 자유롭게 바꿀 수 있음.
  • 단점
    • 버그가 생길 확률이 증가함 -> datetype같은 경우에 게시글 조회할 때 20230101~20230101 이런식으로 입력하면 뒤에 시간을 python에서 임의적으로 지정해서 00:00:00 이렇게 되기 때문에 아무것도 출력이 안될 수 있음
    • 협업하여 코드를 작성할 때, 변수 등의 타입을 명확히 확인할 수 없어 커뮤니케이션에 방해를 줄 수 있음.
  • Type annotation
    • 위에서 언급한 단점들을 보안할 수 있는, python에서 타입에 대한 힌트(type hinting)을 제공하는 기능.
    • 더 다양한 방법이 있긴 한데 간단하게 알아보면 타입을 지정해주는? 정적타입처럼 지정해주는 느낌이라고 이해함.
    • 일단 간단한 예시

변수에 Annotation 사용

name: str = "kim"
age: int = 99
friends: list = ['Kim', 'Lee', 'Park', 'Lim']

함수에 Annotation 사용

def plus(n1: int, n2: int) -> int:
	return n1 + n2
    
def mystery_combine(a: str, b: str, times: int) -> str:
	return (a + b) * times

3. 플랫폼 독립적 언어라서 대부분의 운영체제에서 모두 동작하는 언어임.

 

장점

a. 사용이 쉽습니다. 말씀드린 특징과도 연관되는 장점인데, 컴파일을 안해도 된다, 자료형을 입력하지 않아도 된다 등 사용자 편의성이 높은 편이라고 생각합니다.

b. 사용이 쉽기 때문에 개발 속도도 빠른편입니다. 

 

단점

a. 이것도 특징과 연관되는데 컴파일을 안해도 되는만큼 조금 느립니다. 

b. GIL(global interpreter lock)이 있는데, 하나의 스레드에 모든 자원을 허락하고 나머지 스레드에는 락을 걸어 다른 스레드가 실행되지 않도록 막아버리는 기능입니다.

하지만 python에서 병렬작업과 멀티스레드가 의미없는 것이 아닙니다.

병렬작업은 multi processing 모듈을 통해 가능하고, gil은 cpu동작에서 적용되는걸 말하고 cpu동작을 마치고 I/O 작업을 실행하는 동안에는 다른 스레드가 동시에 동작할 수 있습니다.

(컴퓨터 내에서 수행되는 연산은 메인 CPU가 담당, CPU 는 메인 메모리에 적재되어 있는 명령어들을 실행한다 // 입출력 장치들에는 각각 작은 CPU가 달려있고, 이를 컨트롤러라고 한다. 컨트롤러는 입출력 받은 데이터를 로컬 버퍼에 임시로 저장하는 작업을 담당한다 )

-> GIL의 이유 : 파이썬은 모든것이 객체입니다. 그리고 그 객체는 참조 횟수를 저장하기 위한 필드를 가지는데, 여러 개의 스레드가 python 인터프리터를 동시에 실행하면 값이 올바르지 않게 읽히거나 쓰일 수 있기 때문입니다. 그 각 객체의 참조 횟수가 올바르게 관리되지 못할 수도 있습니다. 뮤텍스를 통해 예방할 수 있긴합니다. 뮤텍스는 열쇠 같은 개념인데 다른 스레드가 다른 스레드에 접근하기 위해서는 열쇠, 즉 뮤텍스가 있어야 접근할 수 있다는 것이지요.

 

python의 동작 순서

python 명령문 -> python 컴파일러 -> 바이트 코드 (.pyc) -> python 인터프리터(가상머신) -> 저급 기계어 -> CPU

 

1. python 컴파일러는 명령어를 바이트코드 명령어로 번역하고 이를 하드 디스크의 .pyc파일에 저장2. python 인터프리터는 .pyc를 번역하여 인터프리터 방식으로 기계어로 번역

 

python 메모리 관리

두 가지 방식 1. 레퍼런스 카운트 2. 가비지 콜렉션

레퍼런스 카운트

파이썬의 모든 객체에 카운트를 포함하고, 이 카운트는 객체가 참조될 때 증가하고, 참조가 삭제될 때 감소시키는 방식. 그리고 카운터가 0이되면 메모리 할당이 삭제됨.

  • 레퍼런스 카운트의 문제 = 순환 참조
    • 순환 참조란 간단하게 컨테이너 객체가 자기 자신을 참조하는 것을 말함. 자기 자신이 참조될 때 프로그래머는 할당 된 객체를 추적하기 어려워지고, 이때 메모리 누수가 발생함.
    • 이러면 레퍼런스 카운트가 0에 도달할 수 없고, 할당된 메모리를 삭제할 수 없어 메모리 누수가 발생함.

가비지 콜렉션(GC)

레퍼런스 카운트도 가비지 콜렉션이라고 부름. 그리고 가비지 콜렉션은 레퍼런스 카운트의 순환 참조를 해결하기 위해 구현됨.

근데 가설이 좀 필요한데,

1. 대부분의 객체는 생성되고 오래 살아남지 못하고 곧바로 버려지는 것

2. 젊은 객체가 오래된 객체를 참조하는 상황은 드물다.

가설에 따르면 오래된 객체는 적고 젊은 객체가 대부분이기 때문에 젊은 객체 위주로 관리함.

 

더 자세한 내용들을 코드를 뜯어보면서 알 수 있긴한데.. 일단 대략적인 개념만 ..