Python은 asyncio 라이브러리를 활용해 비동기 실행을 지원한다. 하지만 asyncio의 경우, 파이썬 버전에 따라 많은 변화가 있었다. 아래 글에 포함된 코드는 Python 3.9.12를 활용해 코드를 실행해 보았다. 특히 3.7 이전의 버전을 활용한다면 아래 글의 예제 코드가 실행되지 않을 수 있다. import asyncio 동기와 비동기 방식을 간략하게 표현하자면 위 그림과 같다. main 작업이 진행되는 동안 동시에(concurrent) 다른 작업이 진행될 수 있는 것이다. (단, 동시에 처리되는 것이지 병렬적으로 처리되는 것은 아니다.) 코루틴 선언 async은 네이티브 코루틴을 선언하는 방식이다. def로 함수를 선언하는 것과 문법이 동일하지만 def 앞에 async을 붙여 사용한다...
제너레이터는 Python 객체의 한 종류로 게으르기 때문에 효율적으로 메모리를 사용할 수 있도록 해준다. (정보를 한 번에 모두 가져오지 않고 정보가 필요할 때 조금씩 불러오는 것을 lazy하다고 표현한다.) 리스트를 활용했을 때와 제너레이터를 활용했을 때 메모리 사용량을 비교해 보았다. 0 ~ 10**6 범위의 자연수를 만들 수 있는 제너레이터와 0 ~ 10**6 범위의 자연수를 가지고 있는 리스트의 메모리 사용량은 아래와 같았다. (상대적인 비교에 초점을 두고 그래프를 보자.) 데이터의 크기가 큰 만큼 둘의 차이도 명확했다. 제너레이터는 하나의 객체이기 때문에 메모리를 많이 차지하지 않는다. 따라서 객체를 반환하거나 복사할 때도 큰 문제가 되지 않는다. 반면, 리스트는 모든 데이터를 담고 있기 때문에..
Context Manager란? 가장 흔하게 사용되는 컨텍스트 관리자는 파일 입출력에 사용되는 "with open()" 구문이다. with open("file.txt", "r") as f: f.read() 위 구문은 처음에 파일을 열고, 구문이 종료될 때 파일을 닫는다. 따라서 내부적으로 open과 close를 모두 수행하고 있는 것이다. 즉, 컨텍스트 관리자(context manager)는 특정 작업의 시작과 끝에 정해진 행동을 수행할 수 있도록 한다. 마치 함수의 데코레이터(decorator)와 비슷한 형태이다. 객체 활용 class Context(object): def __enter__(self): # 사전 작업 return self def __exit__(self, exc_type, exc_val..
메모리 확인 - psutil import os import psutil pid = os.getpid() process = psutil.Process(pid) memory = process.memory_info().rss print(f"사용 중인 메모리: {memory / 1024**2}MiB") 현재 할당된 pid 값을 넘겨받은 psutil.Process는 memory_info를 통해 물리적 메모리의 사용량을 알려준다. 처음에는 데코레이터를 활용해 함수의 시작과 끝에서 메모리 확인을 통해 메모리 사용량을 측정하면 되지 않을까 생각했다. 하지만 Python은 내부적으로 Garbage Collector를 활용해 자동으로 메모리가 관리되기 때문에 함수가 실행되는 과정에서 메모리의 변화가 발생할 수 있다. 그래..
Python은 특정 프로그래밍 방식을 강제하지 않기 때문에 절차 지향, 객체지향, 함수형 등 다양한 방식으로 코드를 이어나갈 수 있다. 함수형 프로그래밍은 코드의 가독성을 높이고, 디버깅을 용이하게 만드는 등 여러 장점을 가지는 방식이다. Python에서도 map이나 filter와 같은 유용한 함수를 통해 그러한 장점을 살릴 수 있다. 하지만 함수형 프로그래밍을 Python에 적용하는 것이 항상 옳다고는 말할 수 없다. 파이썬 공식문서 중 "Functional Programming HOWTO"를 읽어봐도 functools.reduce와 같은 함수의 사용보다 for 루프를 사용한 명시적 표현이 더 명확할 수 있다고 언급하였다. 그렇기 때문에 특정 방식에 집착하기보다 코드의 가독성과 명시성이 중요하다는 대원..
openCV # Conda 설치 > conda install opencv # PIP 설치 > pip install opencv-python opencv는 VideoCapture을 통해 카메라로 인식된 영상을 처리한다. import cv2 cap = cv2.VideoCapture(0) while cap.isOpened(): ret, frame = cap.read() if ret: # 정상적으로 정보를 읽었을 때 else: # 정보를 읽지 못 했을 때 cap.release() VideoCapture의 경우, 사용할 카메라의 인덱스를 넘겨줘야 한다. 만약 연결된 카메라가 2개라면 첫 번째 카메라가 0, 두 번째 카메라는 1이 된다. isOpened는 카메라가 정상적으로 열려있다면 True를 반환한다. 따라서 ..