본문 바로가기

반응형

Computer/Python

(57)
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..
변수 영역과 클로저 숫자로 이루어진 리스트를 정렬하되 정렬한 리스트의 앞쪽에는 우선순위를 부여한 몇몇 숫자를 위치시켜야 한다고 가정해봅시다. 이러한 경우에는 리스트의 sort 메소드에 key 인자로 도우미 함수를 전달하는 것으로 구현할 수 있고 도우미 함수는 주어진 리스트 원소에 대해 중요한 숫자 그룹에 들어있는지 체크합니다. def sort_priority(values, group): def helper(x): if x in group: return (0, x) return (1, x) values.sort(key=helper) numbers = [8,3,1,2,5,4,7,6] group = {2,3,5,7} sort_priority(numbers, group) print(numbers) 파이썬은 자신이 정의된 영역 밖에..
스레드 세이프 (Thread-safe) GIL (Global Interpreter Lock), Multi-Threading 이전 포스트에서 GIL을 살펴봤는데 GIL 자체가 하나의 스레드가 리소스를 점유하는 것이니 멀티 스레드를 사용할 때 더 이상 상호 배제 락 (mutext)를 사용하지 않아도 되는 것으로 생각할 수 있습니다. GIL이 파이썬에서 멀티 스레딩을 막는다면 당연히 프로그램의 데이터 구조에 동시에 접근할 수 없게끔 (Thread-safe) 구현되있지 않을까 하는 것이죠. 하지만 GIL은 스레드 세이프를 보장해주지 못합니다. 파이썬 스레드는 한 번에 단 하나만 실행되지만 여러 스레드가 같은 데이터 구조에 동시에 접근하는 것은 막지 못하며 안타깝게도 스레드끼리 언제 인터럽트될지 알 수가 없습니다. 예를 들어 병렬적으로 여러 가지의 개..
GIL (Global Interpreter Lock), Multi-Threading 파이썬의 표준 구현을 CPython 이라고 합니다. CPython은 1) 소스 코드를 구문 분석해서 8비트 명령어로 이루어진 바이트코드 (파이썬 3.6 부터는 16비트 명령어를 사용하므로 워드코드) 로 변환하고, 2) 스택 기반 인터프리터를 통해 바이트코드를 실행합니다. 바이트코드 인터프리터에는 파이썬 프로그램이 실행되는 동안 일관성 있게 유지해야 하는 상태가 존재하는데 CPython은 스레드 세이프하지 않은 메모리 관리를 쉽게 하기 위해, GIL (Global Interpreter Lock) 이라는 방법으로 여러 개의 스레드의 메모리 접근을 제한하는 형태로 일관성을 강제로 유지합니다. 즉, Figure 1에서 처럼 여러 개의 스레드가 병렬로 존재한다고 하더라도 실제로는 특정 순간에 하나의 스레드만 동작..
제너레이터와 yield (1) 파이썬 코딩을 하다보면 시퀀스를 결과로 출력하는 일이 많습니다. 이럴때 가장 간단한 선택은 담길 원소들이 저장된 리스트를 반호나하는 것이죠. 예를 들어 문자열에서 띄어쓰기의 인덱스를 반환하고 싶다면 다음 코드와 같이 리스트의 append 메소드를 사용해 리스트에 결과를 추가하고 함수 마지막에 리스트를 반환하면 됩니다. def index_words(text): result = [] if text: result.append(0) for index, letter in enumerate(text): if letter == ' ': result.append(index+1) return result address = 'I am a student and a male and looking-good' result = i..
Numba (1) 파이썬은 인터프리터 언어로서 C/C++/Fortran 과 같은 컴파일 언어에 비해 느리지만, 파이썬 코드를 LLVM 컴파일러를 이용해 머신 코드로 바꾸어 수치연산을 가속화해주는 Numba 컴파일러가 존재합니다.Numba는 수치 계산에 초점을 맞춘 파이썬을 위한 오픈 소스 JIT (Just-In Time) 컴파일러로 2012년 컨티넘 애널리틱스 (현재 아나콘다) 에서 처음 만들어졌습니다. Numba 라이브러리의 주요 특징으로는, 전체 애플리케이션, 프로그램이 아닌 @jit, @njit 데코레이터로 장식된 함수에 대해서만 별도로 컴파일합니다. 파이썬은 보통 파이썬 인터프리터 CPython 을 사용하는데, Numba 는 별도의 인터프리터를 사용하지 않고 최적화된 별도의 빠른 함수를 만들어줍니다. 함수에는 입력..
Pycharm - Python Interpreter 지난 포스트 [개발 잡학/Python] - Pycharm 설치 Pycharm 을 설치하면 파이썬 interpreter 또한 같이 설치되는데 윈도우에는 파이썬 version 3.8.8, MacOS 에는 파이썬 version 2.7 이 설치됩니다. 특히, 파이썬 version 2.x 는 2020년 이후로 지원을 하지 않고 최근 파이썬 라이브러리 또한 지원하지 않기 때문에 파이썬 version 최소 3.6 이상의 interpreter 는 필수적입니다. 현재 저의 컴퓨터에도 파이썬 version 3.8.8 이 깔려 있으니 가장 최신 version 인 3.9.5 를 설치해보도록 하겠습니다. 먼저 www.python.org/downloads/ 에서 Python 3.9.5 패키지를 선택해 다운받습니다. 자신의 OS에..
예외 처리에서의 동작 수행 - try/except/else/finally 파이썬에서 예외를 처리하는 과정에서 특정 동작을 수행하고 싶을 때 try, except, else finally 구문을 사용합니다. 전체 복합문에서 각 블록은 서로 다른 목적에 쓰이며, 다양하게 조합하면 유용합니다. finally 예외가 발생하면 본래 호출 스택의 위 (함수 자신을 호출한 함수 쪽)로 예외를 전달해야 하지만, 예외가 발생하더라도 정리 코드를 실행해야 한다면 try/finally 블록을 사용합니다. 특히, 파일을 열고 안전하게 닫는 경우에 자주 사용합니다. def try_finally_example(filename): print('파일 열기') handle = open(filename, encoding='utf-8') try: print('데이터 읽기') return handle.read(..

반응형