본문 바로가기

전체 글190

python 메모리 관리( 레퍼런스 카운트, 가비지 콜렉터) python의 메모리 관리에 궁금증이 생겨 어떤 방식으로 진행하는지 알아보았습니다. 기본적으로 레퍼런스 카운트를 통한 참조 객체의 개수 체크와 가비지 콜렉터의 종합을 통해 관리한다고 보았는데, 순환참조라는 문제점으로 인해 메모리 누수가 발생할 수 있고 이를 확인하기 위해 가비지 콜렉터를 사용한다고 합니다. 예를 들어, a = C() b = C() a.x = b b.x = a 인 상황에서 del(a) del(b) 를 하게 되면 a는 b가 삭제된 후에 삭제됩니다. (b 삭제이후 garbage collector가 호출될때) 가비지 콜렉터는 자바와 유사한 방식으로 구성되어 있는데 generation(세대)과 threshol (임계값)을 통해 가비지 콜렉션 주기와 객체를 관리합니다. 세대는 0,1,2로 구성되어 .. 2021. 6. 20.
python range()와 xrange() (메모리 효율성) 흔히 파이썬에서 주로 사용하는 반복문은 for i in range(10)와 같은 형태입니다. 이는 반환 형태가 리스트입니다. 즉 범위가 10, 이라면 0-9에 해당하는 수가 모두 리스트형태 내부에 존재합니다. 그러나 xrange()는 안에 몇을 선언하든 그 크기가 같습니다. 즉 리스트형태로 모든 값을 가지고 시작하는 것이 아니라 generator와 yield처럼 해당 값에 접근할때마다 데이터를 로드하는 형식으로 작동합니다. 따라서 list에서 사용하는 다양한 형태의 함수를 사용하지 못하지만, 단순히 인덱스나 순차적 접근을 사용한다면 xrange()가 메모리를 보다 효율적으로 사용할 수 있습니다. 참조: https://bluese05.tistory.com/57 2021. 6. 20.
제너레이터, yield (이터레이터와 제너레이터) 이테레이터의 일종으로, next()메소드와 yield를 통해 처리와 처리중단을 반복하는 소진되는 이터레이터라 할 수 있습니다. list,set,dict와 다르게 모든 값을 메모리에 들고 있지 않아도 된다는 이점이 있습니다. 제공받는 데이터가 무한하거나 모든 값을 계산하기엔 시간이 많이 걸릴때 그때 그때 처리하고 싶다면 사용한다고 합니다. 클래스내에서 iterator를 구현하려면 _iter_(iterator현재객체를 리턴) _next_(이터레이터의 루프를 도는 역할) (python2에서는 next 함수)등의 함수가 있어야하고 이를 통해서 이터레이터가 돌아갑니다. (파이썬의 duck typing) generator 또한 for 루프 안에서 돌아갈 수 있는데 이를 통해서 generator expression이.. 2021. 6. 19.
KMP의 일부, computeLPS에 대해서 (KMP) 생각보다 굉장히 쉽다. kmp가 복잡하고 이름이 복잡해보여서 그렇지 기본 틀은 간단하다. lps는 s라는 문자열이 있을때 각 1개의 문자열에서 순서대로 len(s)까지의 길이를 지나는 동안 각 크기의 문자열에 대해 최대 있을 수 있는 가장 긴 prefix와 suffix가 겹치는 길이를 저장한다. 예를 들어 ABCA라는 문자열이 있으면 A, AB,ABC,ABCA라는 문자열을 도는 동안 leng은 0부터 시작해 최대 존재할 수 있을 만큼 길이의 포인터를 가리키게 되고 i는 문자열의 길이를 가리키게 되는 투포인터 방식으로 구하게된다. 즉 i가 1부터 시작해 len(s)보다 작은 동안, leng은 0에서 시작하게 되고(존재할 수 있는 겹치는 길이는 최소0이므로) 일치하면 leng를 증가시키고 lps[i]는 le.. 2021. 6. 19.