본문 바로가기

반응형

Computer

(114)
파이썬과 객체 파이썬의 설계 철학은 간단함입니다. C/C++ 에서와 같이 포인터라는 복잡한 개념을 명시적으로 사용하지 않고 메모리 관리를 별도로 할 필요없이 속도 대신 범용성을 추구하는 usability가 설계의 근본으로 자리잡고 있습니다. 이는 Zen of Python 에서도 잘 드러납니다. 언제나 Zen of Python을 읽을 때마다 내 자신이 파이썬 철학에 맞게 구현하고 있는지 반성하게 됩니다... Beautiful is better than ungly. Explicit is better than implicit. Simple is better than complex. Complex is better than complicated. Flat is better than nested. Sparse is better..
파이썬의 Namespace와 Scope Namespace 파이썬에서 할당은 (assignment, =) 특정 객체에 변수 이름을 부여하는 행위를 말합니다. 예를 들어 "x=3" 이라면 3이라는 객체를 x라는 변수 이름으로 할당하고 x라는 이름은 3이라는 객체의 레퍼런스가 됩니다. Namespace (이름공간)는 여러 객체와 그것의 레퍼런스가 (이름) 사전 타입으로 (키는 객체 레퍼런스의 이름, 값은 객체) 묶인 콜렉션으로 다음과 같이 4가지 타입이 존재합니다. Built-in namespace Built-in namespace 에는 파이썬의 built-in 객체의 이름이 담긴 것으로 파이썬이 구동되고 있다면 언제 어디서든 사용할 수 있는 것들로 구성되어 있습니다. 파이썬에서 다루는 사전예약된 키워드 (return, local, id, dict..
파이썬의 매개변수 전달 방식 파이썬에서 함수의 매개변수 (arguments) 는 어떻게 전달될까요? C/C++ 언어에 익숙한 사람이라면 전달값이 복사되어 매개변수에 전달하는 pass by value (call by value), 존재하는 변수의 레퍼런스 (혹은 메모리 주소) 를 전달하는 pass by reference (call by reference) 를 생각하겠지만 파이썬에서는 pass by assignment 방식으로 함수의 매개변수에 값을 전달합니다. Pass by value / reference in python 다음 코드를 살펴보겠습니다. 파이썬에서는 할당된 객체의 메모리 주소를 반환하는 id() 내장함수가 있고 이를 통해 1) 함수 매개변수가 원래의 변수와 같은 주소를 가지는지와, 2) 같은 이름으로 변수를 재할당 했을..
KMeans 알고리즘 구현하기 KMeans는 대표적인 군집화 알고리즘으로 간단한 특성으로 인해 온사이트 인터뷰나 코딩 테스트에서 스크래치부터 구현해보라는 문제가 가끔씩 출제됩니다. 이번 포스트에서는 scikit-learn, numpy 같은 외부 라이브러리 없이 파이썬의 내장 함수와 라이브러리만으로 KMeans 알고리즘을 구현해보도록 하겠습니다. 군집화할 데이터는 10000개의 16차원 벡터라 가정하면 16개의 실수 요소를 가진 리스트 10000개를 요소로 가진 리스트가 됩니다. Utility functions Euclidean distance Distance metric으로 Euclidean distance를 계산하는 함수를 구현합니다. 입력으로 같은 길이의 리스트 2개를 받고 각 요소 별 차이의 제곱을 모두 더한 후 math 라이브..
Property, Setter, Getter 다른 언어를 사용하다 보면 클래스의 attribute를 위한 getter, setter 메소드를 명시적으로 정의하는 경우가 많습니다. 하지만 이런 코드는 파이썬답지 않고 필드 값을 증가시키는 연산 등의 경우에는 이런 메서드를 사용하면 코드가 지저분해지게 됩니다. (e.g. r0.set_ohms(r0.get_ohms() - 40)) class OldResistor: def __init__(self, ohms): self._ohms = ohms def get_ohms(self): return self._ohms def set_ohms(self, ohms): self._ohms = ohms r0 = OldResistor(50) print(f'Before: {r0.get_ohms()}') r0.set_ohms(..
concurrent.futures를 이용한 병렬화 매우 많은 연산량을 요구하는 파이썬 프로그램에 대해서는 병렬화 없이 결국 성능의 벽에 부딪치게 됩니다. 멀티 스레드를 사용하고자 하더라도 파이썬의 GIL (Global Interpreter Lock)으로 인해 파이썬 스레드는 진정한 병렬 실행이 불가능하므로 하나의 계산을 여러 작업으로 나누는 작업은 파이썬에서는 불필요합니다. 그렇다면 성능에 결정적인 영향을 미치는 부분을 하부 기계에 가까운 C 언어를 사용한 확장 모듈로 작성할 수 있겠지만 여러 부분을 C 언어로 바꾸어야 해서 많은 비용이 들고 포팅하는 과정에서 무수히 많은 버그가 발생할 수 있습니다. 파이썬에서 진정한 병렬화를 통해 속도 향상을 시키기 위해서는 파이썬 3.2 버젼부터 생성된 concurrent.futures 모듈의 multiprocess..
데코레이터와 functools.wrap 파이썬은 함수에 적용할 수 있는 데코레이터 (decorator)를 정의하는 특별한 구문을 제공하는데, 데코레이터는 자신이 감싸고 있는 함수가 호출되기 전과 후에 코드를 추가로 실행합니다. 이는 데코레이터가 자신이 감싸고 있는 함수의 입력 인자, 반환 값, 함수에서 발생한 오류에 접근할 수 있다는 뜻으로 함수의 의미를 강화하거나 디버깅, 함수를 등록하는 등의 일에 유용하게 사용할 수 있습니다. 예를 들어 함수가 호출될 때마다 인자 값과 반환 값을 출력하고 싶을때 다음과 같은 "trace" 라는 데코레이터를 정의할 수 있습니다. def trace(func): def wrapper(*args, **kwargs): result = func(*args, **kwargs) print(f'{func.__name__}..
Public, Private Attributes 파이썬에서 클래스의 attribute에 대한 가시성은 공개 (public), 비공개 (private) 두 가지를 제공합니다. Attribute 이름 앞에 밑줄 두 개 (__)를 붙이면 비공개 필드가 되고 비공개 필드를 포함하는 클래스 안에 잇는 메소드에서는 해당 필드에 직접 접근할 수 있습니다. 하지만 클래스 외부에서 비공개 필드에 점 연산자 (.) 를 통해 직접적으로 접근하면 예외가 발생합니다. class MyObject: def __init__(self): self.public_field = 5 self.__private_field = 10 def get_private_field(self): return self.__private_field foo = MyObject() assert foo.publi..

반응형