본문 바로가기

반응형

Computer

(114)
변수 영역과 클로저 숫자로 이루어진 리스트를 정렬하되 정렬한 리스트의 앞쪽에는 우선순위를 부여한 몇몇 숫자를 위치시켜야 한다고 가정해봅시다. 이러한 경우에는 리스트의 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에서 처럼 여러 개의 스레드가 병렬로 존재한다고 하더라도 실제로는 특정 순간에 하나의 스레드만 동작..
코딩테스트 문제 (28) - 정렬 리스트 병합하기 문제 여러 개의 정렬된 리스트를 1개의 정렬된 리스트로 병합하는 문제입니다. a = [[1,4,5],[1,3,4],[2,6]] => [1,1,2,3,4,4,5,6] 풀이 이 문제는 우선순위 큐를 사용해 풀 수 있는 문제로 파이썬에서 heapq 모듈을 사용하면 됩니다. 파이썬의 heapq 모듈은 최소힙이 구현된 것으로 리스트 원소를 heappush 메소드로 넣고 heappop 메소드로 리스트를 추출할때 이미 정렬되어 있으므로 맨 앞의 원소를 뽑아내고 다시 heap 구조에 집어 넣습니다. from heapq import heappush, heappop def solution(ListofList): result = [] heap = [] for i, l in enumerate(ListofList): heapp..
제너레이터와 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..
코딩테스트 문제 (27) - 리스트에서 부분집합 출력하기 입력으로 숫자가 담긴 리스트가 주어졌을 때 리스트의 모든 부분집합을 출력하는 문제입니다. 지난 포스트에서는 깊이우선탐색으로 (DFS) 풀었지만 간단한 비트 연산자로 해결할 수 있습니다. 비트 연산자란 정수를 2진수로 표현하여 각 비트끼리 연산하는 operator 를 말하는데요, 파이썬에서의 비트 연산자는 비트를 $n$ 칸 만큼 왼쪽으로 옮기는 "> n" 의 두 가지가 존재합니다. 예를 들어 "1
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에..

반응형