전체 글

전체 글

    [Design patterns] Adapter Pattern (어댑터 패턴)

    [Design patterns] Adapter Pattern (어댑터 패턴)

    Introduction 이번 글에서는 structural pattern (구조 패턴) 중 하나인 어댑터 패턴에 대해 소개하고자 한다. 어댑터 패턴에 대해 요약하자면, 현재의 클래스 인터페이스 X를 요구되는 인터페이스인 Y로 변환해 주는 디자인 패턴이라 할 수 있다. 본 글의 많은 부분은 에릭 감마의 GoF Design Pattern 서적에서 참고했고, 파이썬에 맞추어 아주 살짝씩 변경한 부분이 있다. Motivation 재사용을 위해 작성해놓은 툴킷 클래스가, 실제로 그것을 사용하는 쪽에서 요구하는 특수한 인터페이스를 가지고 있지 않아 사용이 불가능한 경우가 있다. 이런 상황에서 여기저기서 재사용되는 기존의 툴킷 클래스의 소스 코드를 변경하지 않고 현재의 특수한 인터페이스 요구 상황에 맞추기 위해 어댑터..

    [Python] 파이썬 3.11 기능 소개

    [Python] 파이썬 3.11 기능 소개

    Introduction 파이썬 3.10 기능 소개를 한 지 얼마 지나지 않은 것 같은데, 슬슬 3.11 버전에 대한 소식도 들려오고 있다. 이번 글에서는 3.10 버전과 비교해 3.11 버전에서는 어떤 기능들이 새롭게 추가 되었는지 소개하고자 한다. 이 글은 3.11.0b4 릴리즈를 기준으로 한다. 설치는 이 링크를 참고하자. 예제와 표의 일부는 공식 도큐멘테이션에서 참고했다. (이전 글) [Python] 파이썬 3.10 기능 소개 1. Faster CPython 파이썬 3.11 버전은 이전 버전에 비해 (3.10) 전반적인 실행 속도가 10%~60% 정도, 평균적으로는 25% 정도 빨라졌다고 한다. 설명만으로는 와닿지 않으니 한번 테스트를 해 보자. import time def timer(functio..

    [Python] Error parsing XML: not well-formed (invalid token) 에러 해결

    [Python] Error parsing XML: not well-formed (invalid token) 에러 해결

    Introduction 파이썬에서 XML 파일을 자동으로 생성한 후, xmltodict 나 ElementTree 를 사용해 다시 XML 파일을 파싱하려고 할 때 다음과 같은 에러가 발생하는 경우가 있다. Error parsing XML: not well-formed (invalid token) 사용하는 도구에 따라 XML 파일의 어느 위치가 잘못 되었는지 알려 주기도 하기 때문에 vim과 같은 에디터를 열어 해당 위치 내용을 직접 수정해도 되지만, 파일이 크고 수정해야 하는 지점이 많으면 이 방법을 사용하기엔 여의치 않다. 이번 글에서는 파이썬을 이용해 해당 문제를 편하게 해결하는 방법을 소개한다. Problem 위 문제의 원인은 크게 두 가지로 나눌 수 있다. XML 파일 내부에 XML 문서에서 처음부..

    [Python] 리스트 값을 기준으로 다른 리스트 분리하기

    [Python] 리스트 값을 기준으로 다른 리스트 분리하기

    Introduction 가끔, 매번 외워두고 쓸 정도로 자주 쓰는 기능은 아닌데 막상 사용하려고 하면 까먹어서 다시 찾아보게 되는 기능들이 몇 가지 있다. 오늘 소개할 내용이 그런 내용인데, 바로 리스트 A의 각 요소 값을 기준으로 리스트 B를 분리하는 기능이다. 느낌적인 느낌은 아래와 같다. list_a = [1, 2, 3, 4, 5] list_b = [2.5, 4.5] >>> split_list_by_thresholds(target=list_a, thresholds=list_b) [[1, 2], [3, 4], [5]] list_b를 임계값 리스트로 사용해 list_a를 분리한다고 했을 때 원하는 결과의 모습이다. Solution 코드 공간을 더 많이 차지하지만 더 빠른 솔루션이 있고, 그냥 한 줄에 ..

    [PyTorch] 데이터의 텐서 변환 시 as_tensor, from_array 속도 비교

    [PyTorch] 데이터의 텐서 변환 시 as_tensor, from_array 속도 비교

    Introduction 파이토치 사용 중에 list나 numpy array를 데이터 copy 없이 torch tensor로 view를 변환해야 하는 일이 굉장히 자주 있다. 파이토치에서는 이런 종류의 변환 작업을 위한 메소드를 이것저것 제공하고 있는데, 문득 어떤 데이터에 어떤 방식을 사용해야 가장 속도가 빠를지 궁금해졌다. 이번 글에서는 간단한 실험을 통해 어떤 상황에서 어떤 도구가 가장 효율적인지 알아보려고 한다. 결론만 말하자면, 꽤 큰 사이즈 의 list라면 as_tensor를 쓰는 게 더 빠르고, np.array에는 from_numpy를 사용하는 쪽이 더 좋다. List to Tensor 먼저 리스트를 CPU 텐서로 변환하는 상황을 살펴보자. 직접 as_tensor 를 통해 리스트에서 텐서로 갈..

    [Python] overrides 라이브러리 (리스코브 치환 원칙)

    [Python] overrides 라이브러리 (리스코브 치환 원칙)

    Introduction 파이썬에서 클래스 계층 구조를 확장시키다 보면 부모 클래스의 메서드를 오버라이딩 (overriding) 해야 할 일이 분명히 있을 것이다. 오버라이딩이란 부모 클래스를 상속받는 자식 클래스에서, 부모 클래스에서 이미 정의된 메서드를 새로 정의하는 행위를 뜻한다. 아래의 코드를 참고하자. class FooClass(): def __init__(self): pass def foo_function(self): print("Foo function.") return class FooChildClass(FooClass): def __init__(self): pass # Method overrided. def foo_function(self): super().foo_function() prin..

    [Design patterns] Singleton Pattern (싱글턴 패턴)

    [Design patterns] Singleton Pattern (싱글턴 패턴)

    Introduction Design Patterns: Elements of Reusable Object-Oriented Software (1994) 의 저자인 Erich Gamma 는 책이 출판된 15년 후의 인터뷰에서 이렇게 언급한 적이 있다. Larry: How would you refactor "Design Patterns"? Erich: ... When discussing which patterns to drop, we found that we still love them all. (Not really — I'm in favor of dropping Singleton. Its use is almost always a design smell.) 의역하자면 다음과 같다. Larry: "Design P..

    [Python] PEP 8: E731 do not assign a lambda expression, use a def

    [Python] PEP 8: E731 do not assign a lambda expression, use a def

    Introduction 파이썬에는 lambda expression (람다 표현식) 이라는 기능이 있다. 파이썬 코드를 자주 보는 사람들은 모두 한 번쯤은 람다 표현식을 써 봤거나 남이 쓰는 것을 본 적이 있을 것이다. 그런데 PEP 8 (참고) 규약을 기반으로 하는 정적 분석기 (ex. pycodestyle) 나 코드 오토포매터 (ex. autopep8) 를 사용하는 경우, 해당 도구들은 변수에 대입되는 람다 표현식을 목격하기만 하면 경고 메시지를 출력하거나 알아서 같은 기능을 하는 함수 정의로 대체해 버리는 것을 볼 수 있다. # autopep8의 format on save를 켜 둔 상태로 Ctrl + S를 누르면.. sample_lambda_expression = lambda x: x**2 # 이렇게..