Python
del 과 가비지 컬렉션
del 과 가비지 컬렉션
2020.12.02cpython 의 경우 가비지 컬렉션은 주로 참조 카운트(reference count)에 기반한다. refcount 가 0이 되자마자 cpython이 객체의 __del__() 메세드를 호출하고 객체에 할당되어 있는 메모리를 해제함으로써 객체가 제거된다. 파이썬 구현에서는 참조 카운트에 기반하지 않는 더 정교한 가비지 컬렉터를 사용하므로, 객체에 대한 참조가 모두 사라진 경우에도 __del__() 메서드가 바로 호출되지 않을 수도 있다. import weakref s1 = {1, 2, 3} s2 = s1 def bye(): print("Gone with the wind...") ender = weakref.finalize(s1, bye) print(ender.alive) del s1 print(ender...
numpy로 행렬 사용하기
numpy로 행렬 사용하기
2020.12.01import numpy as np numpy 모듈을 불러옵니다. numpy 로 4 x 3 행렬을 만들겠습니다. array = np.array([ [1, -1, 2], [3, 2, 2], [4, 1, 2], [7, 5, 6] ]) 3 x 2 행렬을 만들겠습니다. array2 = np.array([ [0, 1], [-1, 3], [5, 2] ]) 0과 1사의 랜덤한 값으로 배열을 만들겠습니다. randomArray = np.random.rand(3, 5) rand의 첫번째 argument 가 row 두번째 argument 가 columns 입니다. 0으로 가득찬 배열을 만들고 싶을땐 np.zeros((2, 4)) 요기서 주의할점 안에 괄호를 하나더 만들어 줘야합니다.
행렬과 벡터
행렬과 벡터
2020.12.01
간단한 데커레이터 구현하기
간단한 데커레이터 구현하기
2020.11.28import time def clock(func): def clocked(*args): # 내부 함수 clocked() 가 임의 개수의 위치 인수를 받을 수 있도록 정의한다. t0 = time.perf_counter() result = func(*args) # clocked() 에 대한 클로저에 자유 변수 func가 들어가야 이 코드가 작동한다. elapsed = time.perf_counter() name = func.__name__ arg_str = ', '.join(repr(arg) for arg in args) print('[%0.8fs] %s(%s) -> %r' % (elapsed, name, arg_str, result)) return result return clocked 이함수는 데커레이트..
nonlocal 선언 이 필요한 이유
nonlocal 선언 이 필요한 이유
2020.11.28def make_averager(): series = [] def average(new_value): series.append(new_value) total = sum(series) return total/len(series) return average make_averager() 는 그리 효율적이지 않다. 우리는 모든 값을 series 에 저장하고 average() 가 호출될 때마다 sum을 다시 계산했다. 합계와 항목 수를 저장 한 후 이 두개의 숫자를 이용해서 평균을 구하면 훨씬더 효율적으로 구현할 수 있다. def make_averager2(): count = 0 total = 0 def averager(new_value): count += 1 total += new_value return tot..
클로저 함수
클로저 함수
2020.11.28블로그 글을 보다 보면 클로저를 익명 함수와 혼동하는 경우가 종종 있다. 아마도 익명 함수를 이요하면서 함수 안에 함수를 정의하는 방식이 보편화 되었기 때문으로 생각된다. 그리고 클로저는 내포된 함수 안에서만 의미가 있다. 따라서 클로저와 익명 함수를 동일한 개념으로 생각하는 사람이 많은 것 같다. class Averager: def __init__(self): self.series = [] def __call__(self, new_value): self.series.append(new_value) total = sum(self.series) return total/len(self.series) avg = Averager() print(avg(10)) print(avg(11)) 10.0과 10.5가 출력..
변수 범위 규칙
변수 범위 규칙
2020.11.27b = 6 def f1(a): print(a) print(b) b = 9 f1(3) 이 문법은 발생시키는데 전역 변수 b가 있고 print(b) 다음에 지역 변수 b에 할당하는 문이 나오므로 전역 변수의 값이 6이 출력될 것이라고 생각 했지만 아니다. 사실은 파이썬이 함수 본체를 컴파일 할때 b가 함수 안에서 할당되므로 b를 지역 변수로 판단한다. 생성된 바이트코드를 보면 이 판단에 의해 지역 환경에서 b를 가져오려 한다는 것을 알수 있다. 나중에 f1(3)을 호출할 때 지역변수 a의 값을 출력하지만 지역 변수 b의 값을 가져오려 할때 b가 바인딩 되어 있지 않다는 것을 발견한다. 이 현상은 버그가 아니고 설계 결정사항이다. 파이썬은 변수가 선언되어 있기를 요구하지 않지만, 함수 본체 안에서 할당된 변수..
데커레이터 함수 이해하기
데커레이터 함수 이해하기
2020.11.27""" 함수 데커레이터는 소스 코드에 있는 함수를 '표시'해서 함수의 작동을 개선할 수 있게 해준다. 강력한 기능이지만, 데커레이터를 자유자재로 사용하려면 먼저 클로저를 알아야한다. 파이썬 3.0에 추가된 nonlocal은 최근에 추가된 예약 키워드 중 하나다. """ """ 데커레이터는 다른 함수를 인수로 받는 콜러블(데커레이트된 함수)이다. 데커레이터는 데커레이트된 함수에 어떤 처리를 수행하고, 함수를 반환하거나 함수를 다른 함수나 콜러블 객체로 대체한다. """ """ 데커레이터의 핵심 특징은 데커레이트된 함수가 정의된 직후에 실행된다는 것이다. 이는 일반적으로 파이썬이 모듈을 로딩하는 시점, 즉 임포트 타임에 실행된다. """ def deco(func): def inner(): print("run..
메서드타입 - class method
메서드타입 - class method
2020.11.27class A: count = 0 def __init__(self): A.count += 1 def exclaim(self): print("I'm an A") @classmethod def kids(cls): print("A has", cls.count, "little objects.") easy_a = A() breezy_a = A() wheezy_a = A() A.kids() class 메서드는 클래스 전체에 영향을 미친다. class 에 어떤 변화는 모든 객체에 영향을 미친다. 클래스 정의에서 함수에 @classmethod 데커레이터가 있다면 이것은 클래스 메서드다. 또한 이 메서드의 첫 번째 매개변수는 클래스 자신이다. 파이썬 에서는 보통 이 클래스의 매개변수를 cls로 쓴다. class는 예약어..
제너레이터를 이용한 지연 실행
제너레이터를 이용한 지연 실행
2020.11.25""" 메모리 사용 측면에서 제너레이터가 유리한 경우는 현재 값만 필요한 경우 제너레이터를 사용한 피보나치 수열 계산에서도 항시 현재 값만 사용할 뿐 수열 앞쪽에 나온 다른 값을 참조 할수 없다. 이런 알고리즘을 단일 패스 single pass or online 이라고 한다. 이런 특징 때문에 제너레이터를 사용하기 어려운 경우가 있는데, 그럴 때 도움 이 되는 모듈이나 함수가 많다. 그중 표준 라이브러리인 itertools 가 가장 대표적이다. 대표적인 유용한 함수는 다음과 같다. 초 단위로 기록된 20년 치의 데이터를 분석한다고 하면 처리해야 할 데이터의 수는 631,152,000개 입니다. 파일에 저장되어 있고 초단위로 한 줄씩 기록되어 있다. 이 전부를 메모리에 올릴 수는 없는 상황이다. 이데이터에..
파이썬에서 효율적으로 피보나치 수열 접근하기
파이썬에서 효율적으로 피보나치 수열 접근하기
2020.11.25# 500이하의 피보나치 수 중에서 홀수는 몇개인지 세는 방법 def fibonacci_naive(): i, j = 0, 1 cnt = 0 while j 5000: break if f % 2: cnt += 1 return cnt from itertools import islice def fibonacci_succinct(): is_odd = lambda x: x % 2 first_5000 = islice(fibonacci(), 0, 5000) return sum(1 for x in first_5000 if is_odd(x)) 세가지 함수 모두 5000보다 작은 피보나치 수열중에서 홀수의 개수를 구하는 함수입니다. 세가지 함수 모두 속도와 메모리 사용량이 비슷하지만 fibonacci_transform 함수..
bisect 모듈을 이용한 가까운 값 찾기
bisect 모듈을 이용한 가까운 값 찾기
2020.11.25# bisect 모듈을 이용해서 가까운 값 찾기 import bisect import random def find_closest(haystack, needle): # bisect.bisect_left는 haystack에서 needle보다 크거나 같은 # 첫 번째 값의 위치를 반환한다. i = bisect.bisect_left(haystack, needle) if i == len(haystack): return i - 1 elif haystack[i] == needle: return i elif i > 0: j = i - 1 # 여기서, i번째 값은 needle보다 크므로(반대로 j번째 값은 needle보다 작다) # i번째 값과 j번째 값 중 어떤 값이 needle에 가까운지 비교하기 위해 # 절대값을 ..