본문 바로가기

파이썬14

Python unittest module 사용 프로그램을 개발할 때 Unit test를 수행하는 경우가 많다. 처음 프로그래밍을 시작하였을 때에는 오류가 생겼을 때 프로그램 중간에 관련 출력문을 추가하여 함수의 출력이나 결과를 확인하는 경우가 많다. 하지만, 프로그램이 살짝만 복잡해져도 어느 함수에서 오류가 발생하였는지 추적하는 것이 힘들어지게 된다. Unit test를 하는 경우 어느 함수 혹은 메소드가 통과하여야 하는 테스트들을 작성해 놓은 뒤 테스트를 수행하게 된다. 테스트 케이스를 잘 작성해 놓은 경우 테스트 결과를 확인하는 것으로 어느 함수가 경우에 대해 동작하고, 제대로 동작하지 않는지를 볼 수 있다. python에서는 이를 unittest 모듈을 사용하여 쉽게 수행할 수 있다. unittest 모듈 간단하게 사용하기 unittest.Te.. 2021. 12. 23.
Python os.fork, os.wait 멀티프로세싱 3 학부에서 Linux 시스템 프로그래밍을 배울 때 멀티프로세싱을 다루었었다. 이때 fork, wait의 system call을 사용하였었다. 그런데 이 system call들을 python에서도 사용할 수 있다. 이 systam call들은 os 모듈을 사용하여 접근할 수 있다. 이를 이용하면 파이썬에서도 c에서와 유사하게 multi-processing을 할 수 있다. 단, Ms Windows처럼 이 system call들을 지원하지 않는 운영체제에서는 사용할 수 없다. fork c에서 fork는 fork를 사용한 시점에서 새로운 프로세스를 생성하는 system call이다. fork 이후에는 기존 프로세스와 새롭게 생성된 프로세스 모두에서 이후 코드들이 실행되게 한다. python에서의 fork 도 이와.. 2021. 11. 19.
python argparse를 사용하여 커맨드 라인 인자 처리하기 python을 notebook형식이 아닌 .py 파이썬 파일 형식으로 커맨드상에서 실행하는 경우들이 존재한다. 이 경우 프로그램 실행 시에 커맨드 라인상에서 인자를 전달해야 하는 경우가 있다. 예를 들어 아래와 같이 커맨드에서 실행하도록 한다고 해보자. python train.py resnet 또는 더 많은 인자를 주어서 아래 처럼 실행하는 것도 가능하다고 하자. python train.py resnet --epochs 777 --batch-size 64 --epoches, --batch-size는 타이핑하기 길기 때문에 -e, -b로 짧게 인자를 넘기는 것도 가능하게 하고 싶다. python train.py resnet -e 777 -b 64 위처럼 작동하게 하고 싶다면, 커맨드 라인 (command .. 2021. 8. 4.
Python opencv로 좌표 형태의 도형을 mask 이미지 배열로 변환, 또 역으로 Computer vision과 관련된 AI 경진대회들 중에서는 이미지에서 특정 물체를 분리해야 하는 과제를 주는 대회들이 존재한다. 이때, '어떤 물체가 어디에 존재한다'라는 정보를 mask 이미지로 주는 대회가 있는가 하면 영역을 다각형으로 표현하여 이 다각형의 좌표로 제공하는 대회가 있다. Segmentation 모델의 대부분은 mask 이미지를 받고, 또 mask 이미지의 형태로 결과를 반환한다. 다각형 좌표로 제공받았다면, 이를 mask 이미지로 변환하는 과정이 필요하다. 이 과정에 대하여 알아보자. import numpy as np import cv2 import matplotlib.pyplot as plt 좌표 형태의 도형을 mask배열로 만들기 opencv에 이미 관련 기능이 구현이 되어있다.. 2021. 7. 13.
Python pathlib.Path로 경로관리하기 얼마전 노트북을 새로 구매하였다. 이전 노트북은 debian 운영체제를 사용하고 있었다. 그래서 개인적으로 간단하게 만드는 파이썬 프로그램들에는 별 생각 없이 슬래시(/)가 포함된 경로를 그대로 넣었었다. 이 프로그램들은 경로를 구분하는 데에 역슬래시를 사용하는 윈도우 프로그램에선 정상적으로 작동하지 않는다. os.path.join을 사용해서 처리하려다가 경로를 문자열이 아닌 객체로 처리하는 pathlib.Path에 대해 알게되었다. Path를 이용해서 경로를 처리하는 법 import from pathlib import Path Path 객체 생성 p = Path('.') p2 = Path('.','folder2') 시스템에 따라서 PosixPath, WindowsPath중 하나로 생성이 된다. 경로 연.. 2021. 6. 10.
Python multiprocessing.Process 멀티프로세싱 1 파이썬에서 멀티프로세싱을 이용하여 여러 작업을 동시에 처리할 수 있다. multiprocessing의 Process를 사용하여 이를 간단히 구현할 수 있다. Process 사용 아래 코드는 Process를 사용하는 가장 간단한 방법이다. from multiprocessing import Process def func(string): print(string) if __name__ == "__main__": proc = Process(target=func,args=('process',)) proc.start() process Process의 서브클래스를 만들어 사용할 수도 있다. 이때, 반드시 run() 메서드를 오버 라이딩해주자. from multiprocessing import Process class .. 2021. 6. 3.
Python collections의 Counter로 개수 세기 Python의 리스트나 튜플 혹은 이외의 iterable 한 객체에서 안에 요소가 몇 개가 들어있는지 셈을 하고 싶을 때가 있다. 구현이 오래 걸리는 작업은 아니지만, 구현하기 귀찮거나 시간이 없을 때 collections의 Counter를 사용해주면 좋다. 이 글은 Counter를 사용하는 방법에 대한 내용을 담고 있다. Counter import Counter를 사용해주기 위해 먼저 import를 하자. from collections import Counter 기본적인 Counter의 생성 및 사용 생성자에 아무 값도 넣어주지 않으면 빈 Counter가 생성된다. cnt = Counter() print(cnt) Counter() Counter를 사용하여 iterable 한 객체가 담고 있는 것들을 세.. 2021. 5. 27.
python에서 json 다루기 파이썬에서 json을 다루어 보자. 모듈을 사용하지 않는 방법도 있지만, 편하게 하기 위해 json모듈을 import 하여 사용하자. import json json모듈은 json형식의 문자열들을 파이썬 객체로 바꾸어주고, 그 반대로도 바꾸어준다. 그래서 어떤 파이썬 객체가 어떤 json의 어디에 해당하는지 파악하면 좀 더 편하게 다룰 수 있다. 아래는 그 표이다. Python Json None null dict Object list Array tuple Array int Number float Number str String True true False false 사실 이렇게 써놓아도 크게 외울 것은 없다. 숫자는 숫자고, 문자열은 문자열, True, False는 맨 앞 대문자만 다르다. json에서 p.. 2021. 5. 24.
python의 with 구문 (context manager) 한번 보기 대부분의 경우 파이썬을 배우면서 with를 처음 접하는 때는 파일을 다룰 때이다. 어떤 파일을 다루고 나서는 close를 해주어야 프로그램이 정상 동작한다. 그러나 파일을 다루던 도중에 오류로 인해 예상치 않게 프로그램이 종료가 된 경우 close를 미처 해주지 못한 경우도 발생한다. try - finally 구문을 이용하면 실행 도중 오류가 발생하였을 때 close를 해 줄 수 있다. 그러나 with를 사용하면 우리가 직접 close를 해 줄 필요가 없다. 컨텍스트 매니저를 통해 자원의 할당과 반납을 필요할 때 해주기 때문이다. try finally vs with # Handling file with try - finally f = open('a.txt','w') try: f.write('hello w.. 2021. 5. 19.
Python에서 AhoCorasick(아호코라식) 알고리즘 구현하기 지금 캐글에 논문을 입력으로 받아 논문에서 사용된 데이터셋 이름을 찾는 대회가 진행 중이다. 만약 알고 있는 데이터셋 이름이 있다면, 논문 속에서 그 이름을 단순 문자열 매칭을 이용해서 찾아내어서 출력에 반영할 수 있을 것이다. 처음에는 Test 셋이 몇 개 없는 줄 착각하고 단순 2중 for문으로 이를 구현했었다. 그러나 숨겨진 test 셋에 문서가 8000개가 넘어서 문자열 매칭만 하였음에도 50분이 넘게 걸렸었다. 그래서 이 부분을 다중 패턴 매칭 알고리즘인 아호코라식을 사용하여서 구현하였다. 아호코라식 알고리즘은 찾아야 하는 패턴이 많을 때 단순 2중 for문에 비해 큰 시간 차이를 보인다. 또, 검색해야 하는 범위가 방대할 때, 아호코라식으로는 커피 두 잔 정도 타는 시간에 끝낼 수 있을 것들이.. 2021. 4. 17.