나도 그냥 궁금해서 테스트해봄
def generate_numbers(size):
for i in range(size):
print("Generating number:"+str(i))
yield i
gen = generate_numbers(5)
print str(id(gen)) +" : gen"
print str(id(tuple(gen)))+" : id(tuple(gen))"
1616900885312 : gen
Generating number:0
Generating number:1
Generating number:2
Generating number:3
Generating number:4
1616899727208 : id(tuple(gen))
실행결과임
이 결과에서 도출가능한 지식은 무엇이냐
gen은 그냥 하나의 오브젝트같은거지
출력결과를 보면 알수있다.
즉 gen은 자바의 이터레이터같은거다
그럼 tuple(gen)은 머냐면 tuple을 생성해서 담아주기전에
메모리상에 저장된 gen의 forEach결과를 tuple에 담아서 만들어준다.
이거다.
결론은 next를 5번해주고있다는거다
그 next한 결과가 하나씩 반환되면서 메모리에 일시적으로 저장되고 그 저장되어있는게 한번에 tuple로 담겨서 생성된다.
tuple이 5번 생성되는 것은아니다.
절차적으로 실행되고있기때문에 쓰레드는 하나임
그럼 리스트의 컴프리헨션과 append와 머가 다른가
리스트 object는 이미 메모리상에 존재하고 그곳에 append 해주는거지
결과적으로 반복문이 돌때마다
[0]
[0 1]
[0 1 2]
식으로 메모리상에 새로 쓰여진다
그렇다고 제네레이터방식으로 넣을때
리스트나 튜플에 넣는것의 차이는 1도없음
tuple(gen)이나 list(gen)이나 결과적으로 똑같음
뮤터블이냐 이무터블이냐 그 차이일뿐
저 위에서는 리스트와 튜플로 메모리상의 이점을 얻을수 있는게 1도없다는 말이다
댓글 0