본문은 “Python Concurrency with Asyncio”를 읽고 재구성한 글임을 밝힙니다. 본 포스팅에서는 sleep 함수로 long operation을 simulate 하는 것에 그치지 않고, 실제로 single-threaded socket-based echo server 애플리케이션을 구현하면서 multiple users를...
[Python] asyncio 파헤치기 - ④ 동시성을 지원하는 애플리케이션 구현하기
[Python] Coroutine이 Thread 보다 가벼운/빠른 이유
흔히 coroutine은 thread보다 가볍다(lightweight), 혹은 빠르다(fast)고 알려져 있다. 그 이유는 무엇일까? [1] 자원 효율성 (Resource Efficiency) coroutine은 thread에 비해 메모리와 시스템 자원을 훨씬 적게 사용한다. 각 thread는 별도의 스택 영역을 가지기 때문에 일정량의 메모리를...
[Python] Thread-Local과 Context-Local
본문에서 다루는 예제 코드는 Python threading.local 와 ContextVar 비교 포스팅을 참고했음을 밝힙니다. ASGI 애플리케이션에서는 여러 task가 single thread 기반으로 concurrent 하게 수행된다. 따라서 각 task 마다 어떠한 데이터를 안전하게 관리하려면, thread-local이 아닌 con...
[Python] Singleton을 사용하는 다섯 가지 방법
1. Singleton Pattern 1-1. Singleton Pattern을 사용하는 이유 singleton pattern은 어떤 클래스의 인스턴스가 전체 시스템에서 단 하나만 존재하도록 하기 위해 사용한다. 예를 들어 어떤 서버 프로그램에서 configuration 정보가 AppConfig 클래스로 존재한다고 가정하자. 만약 프로그램의 많은...
[Python] 메타클래스(Metaclass)
본문은 참고한 블로그 및 자료를 제가 이해하기 쉽게 다시 정리한 글임을 밝힙니다. 1. 메타클래스(Metaclass) 파이썬에서는 모든 것이 객체이기 때문에 클래스도 그 자체로 객체이다. 그렇다면 클래스라는 객체를 생성하는 클래스는 무엇일까? 이처럼 “클래스의 클래스”를 메타클래스(metaclass)라고 한다. 파이썬에서 기본적으로 사...
[Algorithm] Quick Select: K 번째 원소 찾기
1. Selection Algorithm 정렬되지 않은 리스트나 배열에서 k 번째 수를 찾는 문제를 selection 문제라고 한다. selection 문제를 해결하는 방법은 크게 세 가지로 나뉜다. 오름차순 정렬 후 index로 접근 ($O(n\log n)$) heap 사용 ($O(n\log k)$) selection 알고리즘 (e...
[Python] 파이썬의 반올림은 사사오입? 오사오입? (+ 부동 소수점, Decimal)
파이썬의 내장 round() 함수는 우리가 흔히 사용하는 “사사오입” 방식의 반올림이 아닌, “오사오입” 방식의 반올림을 제공한다. 오사오입이란 무엇이며 왜 사용하는지, 더 나아가 부동 소수점의 문제점과 이를 해결하는 decimal 모듈까지 살펴보자. 반올림 방식에 대해서는 공식적인 자료를 찾지 못하여 틀린 부분이 있을 수 있음을 밝힙니다. ...
[Python] 간편하게 행렬 뒤집기 & 회전하기 (+ zip(), [::-1])
주어진 matrix의 row가 다음과 같이 구성되어 있다고 가정한다. [1, 2, 3, 4] [5, 6, 7, 8] [9, 10, 11, 12] 1. 뒤집기 transpose = list(zip(*matrix)) (1, 5, 9) (2, 6, 10) (3, 7, 11) (4, 8, 12) 2. 시계방향으로 90도 회전하기 clo...
[Algorithm] Undirected & Directed Graph의 Cycle Detection
주어진 그래프 내에 사이클이 존재하는지 여부를 판단하는 방법은 해당 그래프가 무방향 그래프(undirected graph)인지 방향 그래프(directed graph)인지에 따라 다르다. 그래프에 종류에 따라 cycle detection을 수행하는 방법에 대해 코드로 알아보자! 1. Undirected Graph의 Cycle Detection ...
[Python] list와 dict의 내부 구현과 시간 복잡도 (+ 동적 배열, 해시 충돌)
1. 파이썬의 list 1-1. 배열(Array) 자료구조에는 크게 두 가지 방식이 있다. 연속 방식(contiguous): 메모리 공간 기반 (ex. 배열) 연결 방식(link): 포인터 기반 (ex. 연결 리스트) 연속 방식에 해당하는 배열의 경우, 고정된 크기만큼의 연속된 메모리를 할당하는 방식으로 구현된다. 이때 메모리에 ...