Python 알아두면 좋은 개념들
Python 알아두면 좋은 개념들 — #Python #파이썬 #파이썬이터러블 map map은 Iterable 요소들을 function을 적용한 결과를 반환하는 Ite...
#Python #파이썬 #파이썬이터러블
map
map(function, iterable, ... )
map은 Iterable 요소들을 function을 적용한 결과를 반환하는 Iterator이다.
- 여러개 iterable 참조 가능
- 한번만 처리한다.
iterable
- \_\_iter\_\_() 메서드를 구현하여 반복 가능한 객체이다. f
- or문에서 사용할 수 있는 모든 객체가 iteraable이다.
- list, dict, str
Iterator
- \_\_iter\_\_() + \_\_next\_\_() 메서드를 필수로 구현한다.
- 한번 순회만 가능하다
- map, filter, generator
Class, Instance, Object
Class: 객체를 만들기 위한 설계도
Instance: Class가 실체화 된 것
Object: 메모리에 존재하는 모든 것(가장 포괄적)
class Animal:
def __init__(self, name):
self.name = name
dog = Animal("dooog")
print(isinstance(dog, Animal))
print(isinstance(dog, object))
print(isinstance([1,2,3,4], object))
print(isinstance(1, object))
print(isinstance("", object))
print(isinstance(None, object))
ALL True
List vs Tuple vs Set
Tuple vs List vs Set
| 구분 | List | Tuple | Set |
|---|---|---|---|
| 문법 | \[1, 2, 3\] | (1, 2, 3) | {1, 2, 3} |
| 순서 | 있음 | 있음 | 없음 |
| 중복 | 허용 | 허용 | 불허 |
| 가변성 | Mutable | Immutable | Mutable |
| 인덱싱 | 가능 | 가능 | 불가 |
\* 둘다 index 접근이 가능하다.
\* tuple은 수정이 안됨 (immutable)
\* set은 순서 없다: indexing 불가
파이썬 데코레이터
함수를 받아서 함수를 반환하는 함수이다. 기본적으로 함수는 x, y 처럼 파라미터를 넘기는데, 여기서 x, y가 함수인 함수이다.
def ex_deco(parm_func):
def test():
print("start parm_func")
parm_func()
print("end parm_func")
return 4
return test
@ex_deco
def parm_func():
return print("it is parmater function!!")
print(parm_func())
구조가 조금 난해하다. @ex\_deco로 어떤 메서드를 정의한다는 것은 이 메서드는 ex\_deco function의 파라미터로 쓰겠다는 말과 동일하다. ex\_deco는 메서드를 파라미터로 받은 후 내부에서 또다른 메서드를 정의하여 파라미터 함수를 활용해 새로운 값을 return 할 수 있다.
파이썬 메모리 관리
Python은 자동 메모리 관리를 제공한다. 크게 두 가지 메커니즘을 사용한다.
- Reference Counting(참조 카운팅)
모든 객체는 자신을 참조하는 횟수를 저장한다.
import sys
a = [1, 2, 3]
print(sys.getrefcount(a)) # 2 : 처음 a, getrefcount에 전달한 인자 a = 2
b = a # 참조 추가
print(sys.getrefcount(a) # 3
del b # 참조 제거
print(sys.getrefcount(a)) # 2
-> 이렇게 가다가 참조 카운트가 0이되면 즉시 메모리를 해제한다.
a = None # 이렇게 하면 수동으로 즉시 해제
- Garbage Collection (가비지 컬렉션)
참조 카운팅으로 해결 못하는 순환 참조를 처리합니다.
# 순환 참조 문제
a = []
b = []
a.append(b)
b.append(a)
del a, b
# 참조 카운트가 1이지만 접근 불가능
# -> GC가 탐지해서 해제
import gc
# 수동으로 GC 실행
gc.collect()
# GC 통계 확인
print(gc.get_stats())
# 3. 메모리 풀 (pyMalloc)
작은 객체(512바이트 이하)는 메모리 풀에서 관리
- 메모리 관리 법 (객체별 최적화)
Samll Integer Caching (5-256)
a = 100
b = 100
print(a is b) # True
a = 1000
b = 1000
print(a is b) # False
String Interning
a = "hello"
b = "hello"
print(a is b) # True — 같은 객체 재사용
메모리 누수 방지 팁
1. 순환 참조 피하기
import weakref
class Node:
def __init__(self):
self.parent = None
def set_parent(self, parent):
self.parent = weakref.ref(parent) # 약한 참조
2. 큰 데이터는 generator 사용하기
# 나쁜 예 - 메모리에 전체 로드: 리스트 컴프리헨션 : 전 부 메모리에 로드
data = [x ** 2 for x in range(10000000)]
# 제너레이터 - 하나씩 생성
data = (x ** 2 for x in range(10000000))
import sys
list_data = [x ** 2 for x in range(10000000)]
gen_data = (x ** 2 for x in range(10000000))
print(sys.getsizeof(list_data)) # ~89,000,000 bytes (약 89MB)
print(sys.getsizeof(gen_data)) # 200 bytes 이하