Python 안을 파헤치기

Python은 내가 사용하는 주 언어이다. 근데 파이썬이 어떤 친구인지 깊게 이해해야하지않겠는가? 이미 알고 있던 내용이 좀 되지만 그래도 정리할 겸 블로그 글로 적는다.

What is Python

Python은 스크립트 언어로 컴파일 과정 없이 인터프리터로 바로 실행된다. 컴파일하는 과정이 없어 실행 결과를 빠르게 확인할 수 있지만, 컴파일 과정이 있는 언어에 비해서 느리다 (컴파일 과정이 있고 기계어로 바뀌면 빠른 실행 속도를 보여주므로). 또한 동적 타입 언어를 가져 변수의 자료형을 선언하지 않고 코드가 실행되는 시점에 결정이 된다.

파이썬의 언어를 Interpreting하는 구현체은 CPython이다. CPython은 파이썬이 C언어로 만들어져 그렇다. 그러나 속도가 더 빠른 Pypy나 Jvm위에서 구동하는 Jython도 있다. (Pypy는 JIT 컴파일을 제공하는 인터프리터다. 같은 코드를 매번 해석하는 대신 처음 실행될 때 인터프리트를 하면서 자주 쓰이는 코드를 캐싱한 뒤 코드를 가져다 쓴다)

Python은 싱글스레드로 동작한다. GIL (Global Interpreter Lock) 정책에 의해 CPU 작업을 할때는 하나의 파이썬 코드만 실행할 수 있다. 그래서 자원을 나눠서 처리할때는 멀티스레딩의 의미는 없다. 멀티 스레딩의 경우에는 threading, processing의 경우에는 multiprocessing 모듈을 쓸 수 있다.

파이썬의 메모리 관리

Python의 메모리 관리와 Garbage Collection은 Reference Counting과 Generational Garbage Collection이 있다. Python의 객체는 reference count를 가지고 있는데 사용하면 증가하고 참조가 해제될때 감소한다. Reference Count가 0이 되면 메모리 할당을 해제한다. 그러나 순환참조가 되는 경우의 수가 있을 수 있다. 예시를 보이자면..

>>> a = []
>>> a.append(a)
>>> del a

이런 경우 1이지만 지워지지않는다. 파이썬의 GC는 이를 위해 존재한다. Generational Garbage Collection에선 generation이 있어서 0세대 (young)부터 2세대 (old)가 있으며 GC 프로세스를 실행하고 살아남으면 이전 세대로 올라간다. Threshold도 있는데, 세대마다 객체를 할당한 횟수가 threshold를 넘어가면 이전 세대로 옮겨진다. GC는 0세대일수록 자주 하도록 설계가 되어있다.

파이썬 이모저모

  • 파이썬의 자료형은 모두 객체이다. 그래서 Primitive같은게 없어서 느리다.
  • Container는 자료들을 담는 자료형으로 list, set, tuple, dictionary가 있다.
  • list는 Mutable한 객체이며 array와 linked list특성 둘다 가지고 있음.
  • tuple은 list와 비슷하지만 값변경 불가
  • 클래스는 다음과 같이 사용가능
    ``` class Person: arm = 2 leg = 2 #클래스 변수로 Static하게 사용된다. #생성자 def init(self, name): self.name = name #인스턴스 변수 def sayHi(self): print(“안녕 내이름은 {}이야”.format(self.name))

#상속을 할 때 (상속할 Class명)을 이용 class SuperPerson(Person): arm = 4 def attack(self): print(“Attack”) ```

  • reduce는 .reduce(lambda x,y: x+y, [1,2,3,4,5], 0) 이런식으로 사용
  • *args는 argument, tuple로 받음, **kwargs는 keyward argument, dict로 받음

Reference

https://medium.com/dmsfordsm/garbage-collection-in-python-777916fd3189 https://www.notion.so/Python-571e8547e8034311b4866d597d92fe41