본문 바로가기

Python

(44)
[고성능파이썬] 이터레이터(iterator)와 제네레이터(generator) 🔊 해당 포스팅은 고성능 파이썬 2판 책 서적을 읽고 개인적인 학습 목적 하에 작성된 글입니다. 포스팅에서 사용되는 자료들은 책의 내용을 참고하되 본인이 직접 재구성한 자료임을 알립니다. 이번 포스팅에서는 파이썬에서 반복적인 동작을 수행하는 데 많이 사용되는 iterator(이하 이터레이터)와 generator(이하 제네레이터)에 대해서 배워보도록 하자. 1. iterator 와 generator 간의 관계 이터레이터와 제네레이터 간의 관계에 대해서는 항상 헷갈리는 것 같다. 이 두 개념 간의 차이점을 설명할 때 서로 동일한 수준의 비교는 적절하지 않은 것 같다. 동일한 수준의 비교라 하면 예를 들어, BMW와 Audi 라는 브랜드는 자동차 브랜드라는 동일한 수준을 갖고 있다고 할 수 있다. 하지만 이터..
[고성능파이썬] 리스트(list)와 튜플(tuple)에 관하여 🔊 해당 포스팅은 고성능 파이썬 2판 책 서적을 읽고 개인적인 학습 목적 하에 작성된 글입니다. 포스팅에서 사용되는 자료들은 책의 내용을 참고하되 본인이 직접 재구성한 자료임을 알립니다. 이번 포스팅에서는 파이썬의 기본적인 자료구조에 속하는 리스트(list)와 튜플(tuple)에 대해 좀 더 깊게 이해해보도록 하자. 리스트와 튜플은 어떤 점이 같은지, 또 차이점이 무엇인지, 그에 따라 두 자료구조의 용도에 대해서도 알아보자. 1. 리스트와 튜플의 부모님: 배열 리스트와 튜플은 배열이라는 자료구조에 모두 속하는 자료구조들이다. 주의할 점은 여기서 배열이 python array 모듈로 지원하는 array 클래스도, Numpy의 array를 의미하는 것은 아니다. 말 그대로 자료구조 개념인 배열을 의미한다. ..
[pytorch] pytorch로 구현하는 Attention이 적용된 Seq2Seq 이번 포스팅에서는 pytorch로 Attention 기법이 적용된 Sequence to Sequence 모델을 직접 구현해 보자. 그리고 구현에 앞서 (필자가..) 주로 헷갈리는 시퀀스 데이터가 모델에 들어갈 때의 입/출력 형상이 어떤 과정으로 진행되는지도 살펴보자. 1. 시퀀스 데이터는 모델의 입력으로 어떤 형태(shape)로 들어갈까? Tabular 데이터, 이미지 데이터와는 다르게 시퀀스 데이터는 시퀀스 길이(윈도우 길이)라는 게 존재한다. 그래서 시퀀스 데이터를 처음 다루는 사람에게는 시퀀스 데이터를 딥러닝 모델의 입력으로 넣어줄 때, 어떠한 형상으로 넣어주어야 하는지 또는 모델이 출력을 내뱉었을 때, 그 출력의 형상이 왜 이렇게 되는지에 대해서 헷갈릴 수 있다. 이번 목차에서는 그 헷갈리는 부분..
[고성능파이썬] 프로파일링으로 병목 지점 찾기 🔊 해당 포스팅은 고성능 파이썬 2판 책 서적을 읽고 개인적인 학습 목적 하에 작성된 글입니다. 포스팅에서 사용되는 자료들은 책의 내용을 참고하되 본인이 직접 재구성한 자료임을 알립니다. 이번 포스팅에서는 프로파일링을 통해 파이썬 코드의 병목 지점을 찾아보는 방법들에 대해서 배워본다. 프로파일링의 목표이자 효과는 코드의 병목 지점을 찾아 최소한의 노력으로 코드의 성능을 최대한 끌어올리는 것이다. 프로파일링 대상으로는 CPU 뿐만 아니라 측정 가능한 모든 자원이 된다. 메모리 사용량이나 네트워크 대역폭, 디스크 I/O 측정도 가능하다. 다시 말해, 시스템의 어느 부분이 느린지, 어디서 RAM을 많이 쓰는지, 디스크 I/O나 네트워크 I/O를 과도하게 발생시키는 부분이 어딘지를 확인할 수 있다. 기존 코드나..
[고성능파이썬] 고성능 파이썬을 어떻게 실현시킬 수 있을까? 🔊 해당 포스팅은 고성능 파이썬 2판 책 서적을 읽고 개인적인 학습 목적 하에 작성된 글입니다. 포스팅에서 사용되는 자료들은 책의 내용을 참고하되 본인이 직접 재구성한 자료임을 알립니다. 파이썬이라는 언어를 시작한지 어느덧 4년이 넘어가는 시기에 들어섰다. 중간에 다른 언어를 잠깐 찍먹해본 적은 있었지만 파이썬은 줄곧 손에서 놓지 않았었다. 나름대로 파이썬 실력이 많이 쌓여왔다고 생각했지만 이는 매우 건방진(?) 생각이었음을 최근에 깨닫고 있다. 그래서 파이썬에 대한 실력을 한 번 점프하는 시간을 가져야 겠다고 생각했다. 그러던 중 평소에 봐왔던 책들 중 고성능 파이썬이라는 책을 선택해서 깊게 파보기로 결정했다. 책의 목차를 보니 프로파일링하는 법, 비동기 처리, 파이썬을 컴파일하는 CPython, Cy..
[Python] decorator와 contextmanager, wraps의 사용 이번 포스팅에서는 파이썬 데코레이터에 대한 개념과 이 데코레이터와 관련된 개념들인 contextmanager, wraps의 쓰임에 대해서도 알아보도록 하자. 1. decorator란? 데코레이트는 말 그대로 '꾸미다' 라는 의미이다. 하지만 파이썬에서는 꾸미다라는 의미가 직관적이지는 않은 듯 하다. 그래서 개념 확립이 좀 필요할 듯 하다. 우선 데코레이터를 사용하는 예시 코드를 살펴보자. def decorator(func): print("decorator init") return func @decorator def add_ten(x): return x + 10 res = add_ten(100) print(res) # 출력 # decorator init # 110 decorator 라는 이름의 함수를 만들..
[Python] pyenv 와 poetry의 개념, 그리고 두 개를 함께 사용하기 오랫동안 파이썬을 사용해오면서 가상환경 관리 도구는 conda, 패키지 관리 도구는 pip 으로 사용해왔다. 사실 이 2가지를 굳이 선택한 이유는 따로 없었다. 단지 처음 파이썬을 입문하기 시작할 때 사용하던 도구가 굳혀진 것일 뿐.. 그런데 최근에 두 도구를 사용하면서 드디어(?) 불편한 점으로부터 고통을 받았다. 특히, conda의 경우는 conda 명령어로 설치할 수 있는 패키지가 매우 한정적이라는 점이여서 특히, 여러가지 파이썬 버전을 설치하는 데 제약이 많은 듯 했다. 그리고 pip은 서로 다른 패키지 간에 버전이 다름으로써 충돌이 날 수 있는 문제를 사전에 알려주지 않고, 설치한 것은 다 설치하고 잘 될거라 생각했지만 막상 코드를 실행하면 에러가 발생하는 난항을 겪었다. 그래서 이번 기회에 c..
[Pytorch] 텐서를 복사하는 방법 : clone, detach 이번 포스팅에서는 최근에 Pytorch로 GAN 모델을 구현하면서 알게된 Pytorch의 clone() 메소드와 detach() 메소드에 대해 알아보려고 한다. 파이토치에서 텐서를 복사하는 메소드에는 대표적으로 clone 과 detach가 존재한다. 하지만 이 2가지 사이에는 무슨 차이점이 있을까? 또한 이 2가지 메소드를 조합해서도 사용할 수 있는데, 그러면 조합할 때와 단일하게 사용할 때 간의 차이점은 무엇일까? 우선 이 차이점을 알기 전에 파이토치의 계산 그래프와 AutoGrad 메커니즘에 대해 알아야 이해가 수월할 수 있다. 이 2개는 딥러닝 모델의 순전파, 그리고 역전파 과정을 이해하는 데 필수이다. 필자도 [밑바닥부터 시작한느 딥러닝 시리즈]를 읽으면서 계산 그래프에 대해서 deep-dive하..
[Python] Memory 관리에 대한 이해와 Garbage Collection(GC) 파이썬은 C 계열의 언어들과는 다르게 메모리 관리를 파이썬 스스로 수행해준다. 덕분에 많은 파이썬 개발자들은 어렵고 귀찮은 메모리 관리 작업을 파이썬에게 위임하고 편한 마음으로 개발을 시작한다. 하지만 파이썬의 메모리 누수를 유발하는 문법이나 방식을 남발(?)하게 되다 보면 파이썬에서도 Garbage Collection과 같은 것을 이용해 메모리 관리를 직접 해주는 것이 필요할 수 있다. 그런 최악의 시나리오에 들어가지 않기 위해서 파이썬 개발자로서 파이썬이 메모리를 어떻게 관리하는지 알고 싶었다. 그리고 내가 작성해오는 코드에는 메모리 누수가 없는지도 확인해보고 싶었다.(꽤 많을걸..) 그래서 여러 자료를 찾아보던 중 2015년 배준현님의 Pycon 발표 영상을 찾아보았고, 30분 남짓 되는 시간 동안..
[Python] 재귀함수와 스택, 지역변수와 전역변수 이번 포스팅에서는 Python의 재귀함수가 스택을 활용한다는 점과 Python에서의 지역변수, 전역변수를 살펴보려고 한다. 이번 내용은 생각보다 기초적인 개념이지만 알고리즘 공부를 하면서 몰랐던 내용 중심으로 포스팅하려고 한다. 1. 재귀함수는 스택을 활용한다! 재귀함수는 스택을 활용한다는 것을 알고리즘 공부하면서 솔직히 처음 알았다. DFS 관련 문제를 풀기 시작했는데, 재귀함수가 아직도 와닿지 않았었는데, 스택을 활용한다는 것을 듣고 '아!' 소리가 절로 나왔다. 이런 기초적인 내용을 이제야 알았다는 것에 아쉽긴 하지만 지금이라도 안 게 어딘가! 먼저 스택이란 자료구조는 처음 들어간 데이터가 가장 나중에 나오는 FILO(Frist In Last Out) 방식을 취하는 자료구조이다. 아래처럼 말이다. ..
[Python] Futures를 사용해서 병렬성(Concurrency) 수행하기 이번 포스팅에서는 Python에서 병렬성을 수행하는 방법에 대해 알아보자. 저번 포스팅에서는 Python에서 병행성을 수행하기 위한 코루틴에 대해 알아보았다. 다시 한 번 언급하지만 병행성은 여러가지 일을 순차적으로 왔다갔다 빠르게 실행함으로써 한 번에 여러가지 일을 동시에 하듯이 수행하는 것을 의미한다. 반면 병렬성은 실제로 한 번에 여러가지 일을 동시에 처리하는 것을 말한다. 이번에는 파이썬에서 병렬성을 수행하는 방법에 대해 알아보자. 파이썬에서는 병렬성을 수행하기 위해서 Futures라는 모듈을 사용한다. 자세한 내용은 파이썬 공식문서에서 살펴보자. 병렬성을 실행하기 위해서는 Futures 모듈에서 멀티 쓰레드 또는 멀티 프로세스 익스큐터를 사용한다. 멀티 쓰레드, 멀티 프로세스에 대한 개념은 저번..
[Python] 제네레이터 기반 Coroutine(코루틴) 이번 포스팅에서는 제네레이터 기반 코루틴에 대해서 알아보자. 코루틴은 Python 3.5 이상부터는 aysnc와 await 키워드를 사용하는 Native 코루틴과 def 와 yield 또는 yield from을 함께 사용하는 제네레이터 기반 코루틴이 존재한다. 여기서는 후자에 대해 알아보자. 1. 코루틴이란 무엇일까? 우선 코루틴에 대해 개념부터 살펴보자. 코루틴에 대해서 알아보기 전에 메인루틴과 서브루틴에 대해서도 잠깐 짚어보고 넘어가자. 우선 다음과 같은 함수가 있다고 가정해보자. def calc_func(x): # 서브 루틴 영역 sum_val = 0 for _ in range(5): sum_val += x return sum_val # 메인 루틴 영역 result = calc_func(100) p..
[Python] yield를 사용하는 제네레이터와 itertools의 다양한 함수들 이번 포스팅에서는 yield 키워드를 사용하는 제네레이터 함수를 만들어보고 이것이 어떻게 병행성을 구현할 수 있는지 생각해보자. 그리고 itertools 라이브러리의 다양한 함수들에 대해 간략히 사용법에 대해 알아보자. 1. yield를 사용한 제네레이터 보통 함수를 작성할 때 우리는 return 을 사용해왔다. 그러나 return 대신 yield 키워드를 사용하게 되면 제네레이터 함수를 만들어주어 병행성을 구현할 수 있다. 여기서 병행성이란, 하나의 프로세서 또는 쓰레드가 한 번에 여러가지 일을 순차적으로 번갈아가면서 수행해주어 사람의 눈에서는 여러개의 일을 동시에 처리하는 것처럼 보이게 되는 것을 말한다. 참고로 병렬성은 정말로 한 번에 여러가지 일을 실행하는 것을 의미한다. 그렇다면 파이썬에서 병행..
[Python] iterator 와 generator에 대해 알아보기 이번 포스팅에서는 Python에서 중요한 이터레이터와 제네레이터에 대해 알아보고 예시 코드도 살펴보기로 하자. 1. for loop는 어떻게 만들어질까? 파이썬에서 for를 사용한 loop는 매우 빈번하게 사용된다. 그런데 for loop는 어떤 매직 메소드를 활용해서 구현되는 것일까? 우선 아래와 같은 코드가 있다고 해보자. string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' # for loop는 iterable한 객체를 자동으로 iterator로 만들어줌 for s in string: print('for loop->', s) 위 처럼 문자열과 같은 iterable한 객체에 for loop를 사용하게 되면 for loop는 자동으로 iterable한 객체(위 코드에선 문자열)를 iter..
[Python] 가장 긴 증가하는 부분 수열 길이를 찾는 LIS 알고리즘 🔊 이번 포스팅에는 최근에 Python으로 알고리즘을 공부하기 시작하면서 알게 된 여러 알고리즘의 원리와 Python으로 구현하는 방법에 대해 소개해보려 한다. 필자는 최근 알고리즘 공부를 '나동빈'님의 '이것이 취업을 위한 코딩 테스트다 with 파이썬' 이라는 책과 백준 온라인 저지 사이트로 하고 있다. 이 중 '나동빈'님이 저자이신 책에서 가르쳐주는 내용을 기반으로 배운 내용을 정리해보려 한다. 이번 포스팅에서는 가장 긴 증가하는 부분 수열 길이를 찾는 LIS(Longest Increasing Subsequence) 알고리즘 동작 과정을 이해해보고 Python으로 구현하는 방법에 대해 알아보자. 1. 가장 긴 증가하는 부분 수열 가장 긴 증가하는 부분 수열이란 무엇일까? 단어로만 이해하기에는 잘 와..
[Python] 알아두면 좋을 기타 알고리즘 🔊 이번 포스팅에는 최근에 Python으로 알고리즘을 공부하기 시작하면서 알게 된 여러 알고리즘의 원리와 Python으로 구현하는 방법에 대해 소개해보려 한다. 필자는 최근 알고리즘 공부를 '나동빈'님의 '이것이 취업을 위한 코딩 테스트다 with 파이썬'이라는 책과 백준 온라인 저지 사이트로 하고 있다. 이 중 '나동빈'님이 저자이신 책에서 가르쳐주는 내용을 기반으로 배운 내용을 정리해보려 한다. 이번 포스팅에서는 책 속 이론의 마지막 부분인 평소에 알아두면 코딩 테스트나 기타 상황에 잘 사용할 수 있는 기타 알고리즘들에 대해 소개하려고 한다. 소개할 알고리즘 종류들은 소수의 판별, 에라토스테네스의 체, 투 포인터, 구간 합 계산, 순열과 조합으로 총 5가지 알고리즘들에 대해 소개한다. 1. 소수의 ..
[Python] 노드 간의 선후 관계를 고려하는 위상(Topology) 정렬 알고리즘 🔊 이번 포스팅에는 최근에 Python으로 알고리즘을 공부하기 시작하면서 알게 된 여러 알고리즘의 원리와 Python으로 구현하는 방법에 대해 소개해보려 한다. 필자는 최근 알고리즘 공부를 '나동빈'님의 '이것이 취업을 위한 코딩 테스트다 with 파이썬'이라는 책과 백준 온라인 저지 사이트로 하고 있다. 이 중 '나동빈'님이 저자이신 책에서 가르쳐주는 내용을 기반으로 배운 내용을 정리해보려 한다. 이번 포스팅에서는 노드들 간의 선후 관계를 고려하여 정렬을 수행하는 정렬 알고리즘 중 하나인 위상(Topology) 정렬에 대해 알아본다. 그리고 이를 구현한 Python 소스코드도 살펴보자. 1. 진입차수 위상 정렬은 정렬 알고리즘이기도 하지만 노드들 간의 선후 관계를 고려한다는 측면에서 그래프 데이터가 주..
[Python] 최소 신장 트리를 찾는 크루스칼(Kruskal) 알고리즘 🔊 이번 포스팅에는 최근에 Python으로 알고리즘을 공부하기 시작하면서 알게 된 여러 알고리즘의 원리와 Python으로 구현하는 방법에 대해 소개해보려 한다. 필자는 최근 알고리즘 공부를 '나동빈'님의 '이것이 취업을 위한 코딩 테스트다 with 파이썬'이라는 책과 백준 온라인 저지 사이트로 하고 있다. 이 중 '나동빈'님이 저자이신 책에서 가르쳐주는 내용을 기반으로 배운 내용을 정리해보려 한다. 이번 포스팅에서는 최소 신장 트리를 찾는 데 사용되는 알고리즘 중 하나인 크루스칼(Kruskal) 알고리즘에 대해 알아보려고 한다. 해당 알고리즘을 이해하기 위해서는 신장 트리라는 개념이 선행되어야 하므로 신장 트리에 대한 개념을 먼저 소개한 뒤 크루스칼 알고리즘에 대해 알아보고 Python으로 구현하는 소스..
[Python] 그래프 알고리즘 - 서로소 집합 자료구조 🔊 이번 포스팅에는 최근에 Python으로 알고리즘을 공부하기 시작하면서 알게 된 여러 알고리즘의 원리와 Python으로 구현하는 방법에 대해 소개해보려 한다. 필자는 최근 알고리즘 공부를 '나동빈'님의 '이것이 취업을 위한 코딩 테스트다 with 파이썬'이라는 책과 백준 온라인 저지 사이트로 하고 있다. 이 중 '나동빈'님이 저자이신 책에서 가르쳐주는 내용을 기반으로 배운 내용을 정리해보려 한다. 이번 포스팅에서는 그래프 알고리즘 종류 중 하나라고 할 수 있는 서로소 집합 자료구조를 활용한 알고리즘에 대해 알아보려고 한다. 책에서 소개하는 그래프 알고리즘 종류로는 그리디 알고리즘이라고도 할 수 있는 크루스칼 알고리즘과 스택과 큐를 활용해야 하는 위상 정렬 알고리즘이 있다. 이러한 알고리즘을 배우기에 앞..
[Python] 모든 지점에서의 최단경로를 찾는 플로이드 워셜(Floyd-Warshall) 알고리즘 🔊 이번 포스팅에는 최근에 Python으로 알고리즘을 공부하기 시작하면서 알게 된 여러 알고리즘의 원리와 Python으로 구현하는 방법에 대해 소개해보려 한다. 필자는 최근 알고리즘 공부를 '나동빈'님의 '이것이 취업을 위한 코딩 테스트다 with 파이썬'이라는 책과 백준 온라인 저지 사이트로 하고 있다. 이 중 '나동빈'님이 저자이신 책에서 가르쳐주는 내용을 기반으로 배운 내용을 정리해보려 한다. 이번 포스팅에서는 또 다른 최단 경로 알고리즘인 플로이드 워셜 알고리즘에 대해 알아보려고 한다. 저번 포스팅에서 배운 다익스트라(Dijkstra) 알고리즘은 특정 노드라는 시작 노드 1개를 지정하고 그 시작 노드에서 다른 노드들 까지의 최단거리를 구하는 방법이었다. 하지만 플로이드 워셜 알고리즘은 시작 노드를..