no image
Github Actions을 활용한 알고리즘 풀이 README 업데이트 자동화
알고리즘 문제를 풀고, 그 코드를 Github에 업로드하고 있다. 하지만 별도의 README 파일을 작성해두지 않아서 굉장히 어수선한 상태이다. 어떤 문제를 풀었고, 또 그 풀이를 어디서 확인할 수 있는지에 대한 정보가 전혀 없기 때문이다. '이제 정리해야지!'라는 생각에 README 파일을 직접 작성하려고 했다. 하지만 파일이 100개가 넘어서 굉장히 귀찮았다. '그냥 복붙 할까'라는 생각이 잠깐 들기도 했지만, 이왕 하는 거 코드로 한번 구현해 보자라는 생각이 들었다. README는 어떻게 작성? README를 통해 '문제 이름', '문제 링크', '풀이 파일 링크', '풀이 성공 여부' 정보를 제공하려고 한다. 현재 파일들의 경로는 baekjoon/solved/*/b1_1004.py(문제 이름)과 ..
2023.02.15
no image
[Python] argparse 알아보기
argparse CLI를 통해 사용자 입력을 받아야 할 때 주로 활용한다. argparse.Argumentparser() 사용자 입력이 필요한 경우에 활용하자. 인자를 단순히 저장하는 것에 그치지 않고, 추가적인 행동을 명시해주고 싶을 때 활용하자 argparse.Namespace() 사용자 입력이 필요하지 않은 경우에 활용하자. argparse.py 구조 전체 코드에서 _AttributeHolder는 Action, Namespace, ArgumentParser만 상속한다. 인자를 저장하는 것이 모듈 목적인 점을 고려하면, 결국 Action, Namespace, ArgumentParser가 핵심인 것을 알 수 있다. 추가로 코드를 보면 ArgumentParser는 _ActionsCotainer 까지 상속..
2023.01.05
no image
[파이썬] Interpreter(인터프리터) 알아보기
Python(파이썬)의 Interpreter(인터프리터) 확인하기 파이썬은 인터프리터 언어라고 알려져있다. 따라서 보통 생각하는 파이썬의 실행 과정은 다음과 같을 것이다. 하지만 파이썬 인터프리터는 사실 Compiler(컴파일러)와 VM(Virtual Machine)으로 구성돼 있다! 컴파일러에 대한 오해 해결하기 컴파일러만 거치면 바로 기계어(machine code)가 생성되는 거 아닌가? 뒤에 과정은 뭐야? 라고 생각할 수도 있다. 하지만 컴파일러의 역할은 현재 언어를 low-level 언어로 변경하는 것으로 꼭 변환 대상이 기계어일 필요는 없다. 실제로 컴파일러는 변경 대상 및 결과에 따라 다음과 같이 4 가지로 나뉜다. 1. 입력 코드를 바로 기계어로 변환하는 정적 컴파일(Static Compil..
2022.06.08
no image
[파이썬] static type checker
Type Hint(타입 힌트) 점검? 타입 힌트의 필요성을 느껴 사용했다면, 이제 힌트를 제대로 적었는지 확인해야 한다. 파이썬은 Dynamic typing(동적 타이핑) 언어라서, 잘못된 힌트를 적었더라도 실행엔 아무런 이상이 없다. 그래서 힌트가 제대로 됐는지 확인할 수가 없다. 파이썬에서 타입 힌트가 제대로 됐는지 확인하려면 별도의 Type Checker(타입 체커)를 사용해야 한다. 타입 체커는 mypy, pyright, pytype 등이 있는데 이 중에서 mypy와 pyright가 많이 활용되고 있다. 주의할 점 타입 힌트가 파이썬에 도입됐지만, 타입 체커가 아직 정식으로 지원되는 것은 아니라고 한다. 따라서 전체 프로그램 코드를 모두 확인하기 보다는, 확인이 필요한 함수나 클래스만 따로 떼어서..
2022.06.07
no image
Python의 메모리 관리 방법 알아보기
Python의 모든 것은 객체다 파이썬의 메모리 관리 방법을 이해하려면, 우선 파이썬의 모든 것이 객체라는 것을 이해해야 한다. 이는 파이썬의 모든 것은 Heap 영역에 동적으로 할당된 객체를 참조하는 것이라는 말과 동일하다. 실제로 파이썬의 메모리 할당 과정은 다음과 같다. 그림에서 알 수 있듯, Heap 메모리 영역에 동적으로 할당된 객체를 모든 것(변수, 함수)들이 참조하는 구조다. 메모리가 동적으로 할당 된다는 것은, 결국 런타임 시 메모리가 할당된다는 것을 의미한다. 파이썬의 프로그램은 Byte-code(바이트 코드)를 인터프리터가 한 줄 씩 읽어가며 실행되기 때문에 동적 할당과 잘 맞다. 메모리 해제? 동적으로 메모리를 할당할 경우, 자료의 크기 등을 자유롭게 관리할 수 있어 편리하다는 장점이..
2022.06.03
no image
[Python] Global Interpreter Lock(GIL)은 왜 도입됐고, 어떤 특징이 있나요?
Global Interpreter Lock(GIL)? GIL은 문자 그대로 인터프리터에 대한 Lock이다. Lock은 인터프리터가 여러 스레드를 병렬적으로(Parallel) 실행하지 않도록 막는다. 파이썬엔 GIL이 있기 때문에, 인터프리터가 매 순간 1개의 쓰레드만 실행할 수 있다. 결국 파이썬의 멀티 스레딩은 병렬적(Parallel)으로 실행되는 대신, 동시적으로(Concurrent) 실행된다. 이때 여러 스레드 중 실행 될 1개의 스레드를 정하려면, 스레드 스케줄러가 필요하다. 하지만 파이썬은 자체적인 스케줄러가 없어서, OS의 스레드 스케줄링을 그대로 활용한다. 그래서 I/O Block이 발생할 경우 GIL도 마찬가지로 Release된다. 따라서 I/O Bound 작업의 경우, 멀티 스레딩으로 병..
2022.06.03
no image
Python의 메모리 절약법 : Object Interning(객체 재사용)
Mutable vs Immutable 파이썬의 객체는 생성 후 값을 변경할 수 있는지 여부에 따라 mutable, immutable로 나뉜다. 객체의 값을 변경할 수 있다는 것은, 그 값이 변경돼도 같은 메모리 주소를 가진다는 것을 의미한다. 그래서 mutable 객체인 List는 값을 막 바꿔봐도 id가 변하지 않는다. x = [1,2,3] y = x print(id(x)) print(id(y)) y[0] = 3 print(id(y)) print(id(x)) 2062815432192 2062815432192 2062815432192 2062815432192 하지만 immutable 객체인 int의 경우 값을 바꾸면 id가 변하게 된다. 이는 값이 변경되면서, 기존과 다른 새로운 객체를 가리키기 때문이다..
2022.06.03
no image
[파이썬] @(Decorator)란
@(Decorator)란? @staticmethod def _find_best_gt_match( thr: int, gt_matches: Tensor, idx_iou: float, gt_ignore: Tensor, ious: Tensor, idx_det: int ) -> int: """Return id of best ground truth match with current detection. https://github.com/PyTorchLightning/metrics/blob/master/torchmetrics/detection/mean_ap.py#L199-L928 파이썬으로 작성된 코드들을 보면 위와 같이 함수 위에 @로 시작하는 문구들이 있다. 위 코드에선 @staticmethod가 그렇다. 매번 함..
2022.06.01
no image
[파이썬] Formatter와 Linter 알아보기
왜 필요? 똑같은 실행을 하는 코드여도 남이 짠 코드는 잘 안 읽힌다. 모두가 각자 나름의 규칙을 지켜서 최대한 깔끔하게 작성했겠지만 그 규칙이 남에게도 적용되기란 쉽지 않다. 이때, 각자가 최소한 정해진 규칙대로 코드를 작성하려고 노력하면 이해하는데 조금이나마 도움이 될 수 있다. 언어마다 각각의 코드 작성 규칙이 있는데 이를 스타일 가이드 또는 컨벤션이라고 한다. 파이썬에도 PEP8이라는 스타일 가이드가 있다. PEP 8 – Style Guide for Python Code | peps.python.org PEP 8 – Style Guide for Python Code Author Guido van Rossum , Barry Warsaw , Nick Coghlan Status Active Type P..
2022.05.23
no image
[Python] Iterable(반복 가능한 객체)와 Iterator(이터레이터) 이해하기
Iterable(반복 가능한 객체)이란? Iterable의 의미와 효과 Iterable은 문자 그대로 반복 가능한 객체를 의미한다. 반복 가능함은 객체를 구성하는 요소가 여러 개이면서, 이 요소들을 한 번에 하나씩 꺼낼 수 있다는 것을 의미한다. 요소를 한 번에 하나씩 꺼낼 수 있다는 보장이 있다면, 굳이 객체의 모든 요소를 미리 메모리에 저장할 필요가 없다. 매번 실행마다 다음 요소에 해당하는 값만 새로 추가해주면 되기 때문이다. 이 경우 메모리를 절약할 수 있다는 장점이 생기게 되고, 이러한 특성을 Lazy Evaluation이라고 한다. 어떤 객체가 Iterable한가? 어떤 객체가 위와 같은 특성을 가지려면(반복 가능하려면) 해당 객체에 __iter__ 메소드가 있어야 한다. 따라서 hashatt..
2022.05.18
no image
[파이썬] Type hint 사용법
Python에도 Type을 써야 하나? Python은 동적 타이핑 언어기 때문에 함수 및 클래스의 parameter type을 명시해주지 않아도 된다. 따라서 C++의 templates나 JAVA에서의 generic 없이도 함수 및 클래스를 type에 상관없이 재사용할 수 있다. C++로 예를 들면 template을 통해서 type을 임의로 선언해뒀다가 호출 시에는 type을 명시해줘야 한다. 이는 template으로 임시로 부여한 type을 대신할 명시적인 type을 입력하는 것으로 정적 타이핑 언어인 C++에선 필수적이다. #include #include using namespace std; template T sum(T a, T b){ // template으로 임의 type 할당 return a +..
2022.05.13
no image
[파이썬] 변수(Python vs C++)
C++의 변수 할당 과정 C++에서 int 형 변수를 선언한 후 값을 저장하고, 이를 다른 변수에 저장하는 과정은 다음과 같다. int a = 1; int b = a; 4 Byte(int) 만큼의 메모리를 할당한 후 a 라고 이름 붙인다. a에 5를 저장한다. 다시 4 Byte 만큼의 메모리를 할당한 후 b 라고 이름 붙인다. a 에 저장된 5를 b 에 저장한다. 저장된 변수의 메모리를 확인하면 다음과 같다. int a = 1; int b = a; cout
2022.02.08