[Python] Syntax | 04. import
·
Language/Python
import는 외부 파일(모듈)이나 폴더(패키지)에 작성된 코드를 가져와 사용하는 기능입니다.동작 과정import는 코드가 실행되는 런타임에서, import 줄을 만났을 때 실행됩니다. 그래서 코드를 실행하기 전 까지는 모듈을 가져오지 않습니다.import를 통해 가져오는 코드들도 caching의 대상이 될 수 있습니다. 만약 처음 import 하는 모듈(또는 패키지)라면, sys.path를 참고하여 해당 모듈이 위치한 경로를 따라 코드를 가져옵니다. 첫 import가 완료되면, sys.module라는 dictionary 객체에 해당 모듈 코드를 저장합니다. 이후에 같은 모듈을 import 하면, sys.module에서 그 모듈이 존재하는지 확인합니다. 존재한다면 저장된 객체 주소를 불러와 사용합니다.작..
[Python] Syntax | 03. Decorator(@)
·
Language/Python
데코레이터(Decorator)는 기존 함수의 코드를 직접 수정하지 않으면서 새로운 기능을 추가하는 기능입니다.표기법(@)데코레이터도 일종의 함수입니다. 단, 목표하는 함수를 인자로 받아 그 함수 앞뒤로 추가 기능을 구현한 새로운 함수(일반적으로 wrapper라고 부릅니다)를 반환한다는 특징이 있습니다.def my_decorator(func): def wrapper(): print("--- 함수 실행 전 ---") func() # 데코레이터가 적용될 함수 print("--- 함수 실행 후 ---") return wrapper # 새로운 함수를 반환합니다def say_hello(): print("안녕하세요!")dec_say_hello =..
[Python] Event Loop
·
Language/Python
Event Loop는 프로그램이 single thread로 동작하면서도 여러 개의 작업을 동시에 실행하여 multi threading 처럼 보이게 해주는 시스템입니다.구성요소Python의 event loop는 크게 call stack과 ready queue 부분으로 나누어져 있습니다.call stack : 호출된 함수가 쌓이는 공간입니다. 해결된 함수는 call stack에서 제거됩니다. Event loops는 함수가 실행되는 동안 제어권을 넘겨줬다가 함수가 종료될 때 다시 제어권을 받습니다.ready queue : task*들이 call stack에 쌓이기 위해 대기하는 공간입니다. Call stack이 비면 task를 하나씩 빼서 call stack에 추가합니다.*task : coroutine(비동기..
[Python] Library | 08. asyncio
·
Language/Python
asyncio는 coroutine을 사용하여 Python에서 비동기 처리를 구현할 수 있게 해주는 라이브러리입니다.async-await 구문 (Coroutine)비동기 함수를 선언하고 그 안에서 비동기 작업을 기다립니다. await과 함께 나오는 작업이 다 완료되기 전 까지는 다음 줄이 실행되지 않습니다. 여기서 async def로 정의된 함수를 coroutine이라고 합니다.import asyncioasync def say_after(delay, what): await asyncio.sleep(delay) # delay만큼 시간이 흐르기 전까지는 더 진행되지 않습니다. return whatrun()async 함수를 실행하려면 asyncio.run()을 사용하면 됩니다. 일반적으로 진입점에서..
[Python] Closure
·
Language/Python
Closure는 자신을 둘러싼 바깥쪽 함수가 종료된 후에도 그 안의 변수를 기억하고 사용할 수 있는 함수를 말합니다. 함수가 정의될 시점의 바깥 상태를 통째로 감싸서(enclose) 보관하는 것입니다.Closure의 조건바깥쪽 함수가 존재하는 함수라는 점에서 closure는 중첩함수(Nested Function)여야 한다는 것을 알 수 있습니다. 하지만 모든 중첩함수가 closure인 것은 아닙니다. Clousure는 아래 세 가지 조건을 만족해야 합니다.중첩함수일 것안쪽 함수가 바깐쪽 함수의 변수를 참조할 것바깥쪽 함수가 안쪽 함수를 반환값으로 사용할 것# 조건 1 : 중접함def outer_func(message): # 조건들을 만족한 inner_func는 closure가 됩니다. def ..
[Python] Garbage Collection
·
Language/Python
Garbage Collection(GC)Python의 모든 객체는 자신이 얼마나 많이 참조되고 있는지 refcnt 값을 가집니다. Garbage Collector는 데이터를 순회하면서 refcnt=0이 되는 객체를 찾아 garbage collection을 수행합니다.__del__(소멸자, Destructor)Python 클래스를 정의할 때 지정할 수 있는 함수입니다. 만약 GC가 시행될 때 해당 객체의 클래스에 __del__이 선언되어 있다면, 이를 실행합니다.class Garbage(): def __init__(self): # 생성자 : 인스턴스 생성시 실행됨 print("object initialized") def __del__(self): # 소멸자 : 인스턴스 삭제시 실행됨 ..
[Python] 동시성과 GIL(Global Interpreter Lock)
·
Language/Python
GIL(Global Interpreter Lock)Garbage Collection 시스템은 다수의 thread가 함께 동작할 때 race condition으로 인한 문제가 생길 수 있습니다. 예를 들어 refcnt=5인 객체 X가 있다고 해봅시다. X를 A와 B 서로 다른 두 개의 thread가 접근하려고 합니다. 이 때 두 작업이 미세한 시간 차이로 이 X의 refcnt 값을 가져올 수 있습니다. 각자 X를 참조하였으니, refcnt를 1만큼 증가시킬 것입니다. 하지만 A와 B 모두 refcnt=5 일 때 가져왔으므로, 최종적으로 반환하는 refcnt는 7이 아니라 6이 됩니다. 이런 사고를 방지하려면 한 번에 하나의 스레드만 작업할 수 있도록 보장해야 합니다.이 역할을 GIL이 할 수 있습니다. G..
[Python] Syntax | 02. List
·
Language/Python
Python의 리스트(list)는 동적 Arraylist입니다.ArraylistArraylist는 요소의 개수에 따라 자동으로 크기를 확장하거나 축소할 수 있습니다. 예를 들어 요소의 개수가 리스트의 최대 크기보다 많아지면, Python은 해당 리스트의 크기를 두 배로 확장합니다. 반대로 요소의 개수가 최대 크기의 절반보다 적어지면, 리스트의 크기를 반으로 축소합니다.또한 linked list가 아닌 array를 기반으로 하기 때문에, 모든 요소가 연속된 주소에 위치해 있습니다. 따라서 특정 인덱스의 값에 접근할 때는 빠르지만, 값을 추가하거나 제거할 때는 느려질 수 있습니다.객체 참조리스트의 각 자리는 값 자체가 아닌 값을 나타내는 객체의 주소값을 저장합니다. 이 덕분에 리스트는 통일된 하나의 데이터 ..