코딩

    [Python] 프로파일링 (profiling)

    [Python] 프로파일링 (profiling)

    Introduction 파이썬 코드를 작성하다 보면 성능 최적화를 위해 코드의 실행 시간을 정확히 측정하고 싶을 때가 있다. 물론 아래와 같이 time 모듈을 이용해 시간 성능 저하가 예상되는 일부 코드 블럭의 실행 시간을 직접 측정해 볼 수 있지만, 요소별로 실행 시간을 측정하기가 불편하고, 무엇보다도 파이썬의 동적인 특성으로 인해 예상되는 지연 구간과 실제 지연이 일어나는 부분이 다를 수 있다는 문제가 있다. from time import time from math import sin, cos, pi def projectile_landing_position(velocity, angle, g_constant): """ XY평면 (0,0) 좌표에서 X축 기준 angle(deg,

    [Python] 파이썬 디버거 (pdb)

    [Python] 파이썬 디버거 (pdb)

    Introduction 내가 작성한 파이썬 코드가 예상하던 대로 작동하지 않거나, 예기치 못한 오류로 자꾸 종료된다면 프로그램 내부의 지역 변수를 들여다 보고 원하는 지점에 원하는 값이 대입되고 있는 지를 한번 확인해 보면 좋을 것이다. 이를 위해서, 간단하게는 print 함수를 써서 확인이 필요한 지점마다 값을 출력하게 해 프로그램 실행 중의 변수를 확인하거나, 조그만 테스트 코드를 작성해 문제가 될 만한 상황을 재현해 볼 수 있다. 하지만 프로그램과 데이터의 규모가 커지고 복잡해질수록, 위와 같은 방법만으로는 문제의 원인을 해결하기가 여전히 어려울 수 있다. 이런 상황에서는 파이썬 디버거 (pdb) 가 유용한 해결책이 될 수 있다. pdb - Python debugger pdb 모듈은 파이썬을 위한 ..

    [Python] FIFO 큐와 데크(Deque)

    [Python] FIFO 큐와 데크(Deque)

    Introduction 프로그램을 작성하다 보면 선입선출 (First-In First-Out, FIFO) 구조를 위해 큐 (Queue) 자료구조를 활용하면 좋을 때가 있다. FIFO 구조란 더 먼저 추가된 데이터를 먼저 사용하도록 하는, 말 그대로 순차적인 대기열을 떠올리면 이해가 편하다. 파이썬에서는 종종 이런 큐 자료구조를 이용해야 할 때, 기본적인 list 자료형에다 append와 pop(0) 메서드를 붙여서 간편하게 큐 자료구조를 흉내내 쓰곤 한다. List Implementation 예를 들어, 아래와 같이 먼저 빈 리스트 오브젝트를 하나 생성한 후 append를 호출해 리스트 맨 뒤에 새로운 원소를 추가할 수 있으며, 반대로 pop(0)을 호출해 리스트 맨 앞의 원소를 제거하고, 그 값을 반환..

    [Python] 독스트링 (Docstrings)

    [Python] 독스트링 (Docstrings)

    Introduction 파이썬은 동적 타입 언어(참고)라는 특성 때문에 코드의 문서화가 다른 언어에 비해 특히 더 중요하다. 하지만 코드를 개발하면서 따로 잘 정리된 문서를 작성하는 일은 만만치 않은 작업일 것이다. 또한 코드 설명 내용을 찾기 위해 주석을 일일이 뒤지거나 도큐멘테이션을 찾으러 다니는 것 또한 꽤 번거로운 일이다. 파이썬에서는 코드의 문서화와 편리한 문서 참조를 위해 기본 기능으로 독스트링(Docstring) 이라는 기능을 제공하는데, 오늘은 이것에 대해 알아볼 생각이다. Docstrings 독스트링은 함수나 클래스, 모듈에 첨부할 수 있는, 큰 따옴표 세 개 (""") 혹은 작은 따옴표 세 개 (''')로 둘러싸여진 문자열이다. PEP 8 (Python Enhancement Propos..

    [Python] 모듈 단위의 exception 계층 구조

    [Python] 모듈 단위의 exception 계층 구조

    Introduction 지난번에는 예외 처리와 관련해서, 왜 단순한 try, except 문을 사용하지 말아야 하는 지를 간단히 알아봤다. 이전 글 이번에는 파이썬 모듈을 작성할 때 어떤 식으로 예외를 발생시키는 것이 바람직한지에 대해 소개해보려 한다. 결론부터 말하자면, 모듈 최상위 예외 클래스를 이용해 계층 구조를 가지는 예외 클래스를 이용하는 것이 기본 파이썬 예외 클래스를 사용하는 것 보다 훨씬 편리하다고 할 수 있다. Possible problem of using built-in exeptions 먼저, 간단한 사용자 모듈을 하나 생성해 보자. 날아가는 물체의 착륙 지점을 계산하기 위한 코드이다. user_module.py # user_module.py from math import sin, c..

    [Python] 타이핑 / 타입 힌트 (typing / type hint)

    [Python] 타이핑 / 타입 힌트 (typing / type hint)

    Introduction 파이썬은 기본적으로 동적 타입 언어 (dynamically typed language) 이다. 이 말은 결국 어떤 변수에 값을 대입할 때, 타입을 선언해 줄 필요가 없다는 말이다 (프로그램 실행 중에 타입이 결정됨). 이런 특성은 C++이나 Java 등 변수를 선언할 때 부터 타입을 strict 하게 지정해 줘야 하는 정적 타입 언어들과 비교된다. 컴파일 이후에 유연하게 타입이 결정된다는 특성 덕분에 파이썬은 빠른 개발이 가능하며 언어 자체의 진입 장벽이 낮다는 장점이 있지만, 타입 안전성이 컴파일 단계에서 보장되지 않아 실행 중 예상치 못한 TypeError와 마주할 수 있다는 단점도 있다. Type hint 이런 문제에 대응하기 위해 Python 3.5 버전 이후부터 기본 모듈..

    [Python] 언패킹 (Unpacking)

    [Python] 언패킹 (Unpacking)

    Introduction 파이썬 언어에는 몇 가지 특징적인 기능들이 존재하는데, 그 중 하나가 바로 언패킹(Unpacking) 구문이다. 오늘은 이 언패킹에 대해 간단하게 정리해 보려 한다. Iterable Unpacking 파이썬 문법 하에서는, 대입식의 좌측 항에 튜플 혹은 리스트를 가져다 놓는 것이 가능하다. 아래의 예제를 보자. (var_a, var_b) = (5, 7) print(f"Variable A: {var_a}") print(f"Variable B: {var_b}") 대입식의 좌측과 우측이 모두 튜플로 이루어져 있고, 좌측 튜플의 변수들은 우측 튜플로부터 상대적인 위치를 고려해 값을 대입 받고 있다. 코드는 정상적으로 돌아가 5와 7을 출력한다. 물론 좌측 항이 리스트로 이루어진 경우에도 ..

    [Python] PEP 8: E722 do not use bare 'except'

    [Python] PEP 8: E722 do not use bare 'except'

    Introduction 파이썬에는 PEP 8 (Python Enhancement Proposal #8) 이라는 스타일 가이드가 있다. PEP 8 은 파이썬 코드를 깔끔하고 읽기 좋게 작성하기 위한 일련의 규칙들로, pycodestyle 과 같은 코드 스타일 분석 도구를 사용하면 쉽게 PEP 8 가이드를 따르고 있는 지 확인할 수 있다. (이런 툴들은 보통 vscode 같은 IDE에도 내장시켜 사용할 수 있다) 본인도 최근에서야 PEP 8 스타일 가이드 툴을 적용해 봤는데, 한 가지 이유가 궁금해지는 스타일 suggestion이 있었다. E722 do not use bare 'except' 이 제안은 보통 다음과 같은 방식으로 예외를 처리할 때 발생한다. try: ... # 오류 발생을 catch 하고 싶..