[Python] Object class __slots__를 이용한 성능 개선
·
Python/Python
[Python] Object class __slots__를 이용한 성능 개선 0. 개요 Python에서는 Object attribute에 대해서 메모리는 더 적게 사용, 접근 속도는 더 빠르게 하는 방법이 있습니다. 바로, __slots__ 를 사용하는 방법 입니다. 기본적으로 Python은 객체 인스턴스 속성을 Dict를 사용 생성하며 Dict 형은 메모리를 추가적으로 필요로 합니다. slots 을 사용 하는 경우 class는 __dict__, __weakref__ 생성을 하지 않습니다. It restricts the valid set of attribute names on an object to exactly those names listed. Since the attributes are now fi..
[Python] 사전(dict) 와 셋(set) 의 성능
·
Python/Python
사전(dict)과 셋(set) dict와 set은 미리 정해진 순서로 정렬 되지 않는다. dict와 set의 차이점은 set은 key만 가지고 있다는 것이다. 리스트와 튜플은 경우에 따라 검색을 O(logN) 시간 복잡도로 구현할 수 있다. 반면, dict와 set은 O(1)이다. dict와 set은 보통 많은 메모리를 사용한다. 또 해시 함수에 의존 함으로 해시 함수가 느리다면 연산속도도 느릴 것이다. 리스트와 사전 검색 성능 차이 리스트 or 튜플로 구현시 O(N) dict로 구현시 O(1) phonebook_list = [ ("홍길동", "010-1111-1111"), ("김철수", "010-1111-1234"), ("국영수", "010-1234-1234"), ] def find_phonebook_..
[Python] 튜플(tuple) 성능
·
Python/Python
튜플 튜플은 한번 생성되면 내용이나 크기를 변경할 수 없지만 두 튜플을 합칠 수는 있다. >>> t1 = (1,2,3) >>> t2 = (4,5,6) >>> t1 + t2 # (1,2,3,4,5,6) 튜플은 합치면 항상 메모리에 새로운 튜플을 새로 할당 한다. 또 튜플은 여유공간을 할당하지 않기 때문에 자원을 더 적게 사용한다. l = [i for i in range(100000)] t = tuple(l) print('list', sys.getsizeof(l)) print('tuple', sys.getsizeof(t)) list 824464 tuple 800048이 때문에 정적인 데이터를 다룰때는 리스트보다는 튜플이 좋다. 또한 튜플은 정적이기에 리소스 캐싱을 하는데 크기가 ..
[Python] 리스트(list) 성능
·
Python/Python
리스트 리스트는 동적 배열로 크기를 자유자재로 조절할 수 있는데 이러한 변경 가능한 특성 때문에 리스트는 메모리와 추가 연산을 필요로 한다. 리스트에 object 추가 시 기존에 object들과 추가되는 object를 새로운 리스트를 추가하여 생성한다. 새로 추가된 리스트의 크기는 기존 N개와 추가되는 1개 더하여 N+1이 아니라 M개 (M > N+1) 의 크기를 가진다. 크기에 여유를 두는 이유는 메모리 할당과 복사 요청 횟수를 줄이기 위하여다. 리스트의 크기 1을 할당한 이후 크기는 동일하다가 5를 할당하니 크기가 커진다. 이는 새로 리스트를 생성한 것. a = [] print('0', sys.getsizeof(a)) a.append(1) print('1', sys.getsizeof(a)) a.app..
[Python] 검색 방법 profile 해보기
·
Python/Python
이해하기 어느 search 가 빠르고 느린지 확인 하는 방법 import csv def search_fast(haystack, needle): for item in haystack: if item == needle: return True return False def search_slow(haystack, needle): is_exist = False for item in haystack: if item == needle: is_exist = True return is_exist def search_unknown_1(haystack, needle): return any((item == needle for item in haystack)) def search_unknown_2(haystack, needle..