6장 연습 문제 1번

1번 문제는 튜플간의 객체 관계를 확인해보는 문제이다.
>>> t = (1,2,3,4)
>>> s = t[:2] + t[3:]
가 주어져 있고, s가 1,2,4 라는 세 개의 객체를 추가로 가지는지, 메모리의 사용이 얼마나 증가 하는지 묻고 있다.

출력을 해보면
>>> t
(1, 2, 3, 4)
>>> s
(1, 2, 4)
나오는데, id() 함수를 사용해서 주소를 확인 해 보면
>>> id(t[0])
11363984
>>> id(s[0])
11363984
같은 주소를 가지고 있다는 것을 확인 할 수 있다.

즉, 추가적으로 객체를 생성 하지 않는다는 것을 알수 있다. 그렇다면 메모리 사용이 증가 하지 않을까?

확인 해보면 그렇지 않다.

처음에 메모리 사용의 증가를 확인할 방법을 못 찾고 있다가, 파이썬 사용자 모임에 물어 보니까 getsizeof 함수가 추가 되었다는 것을 알 수 있었다. 이 함수는 2.6 버전에서 새로 추가 되어 책에는 나오지 않았다.

getsizeof 함수는 sys모듈에 있으므로 sys 모듈을 임포트 해서 확인 해보면
>>> import sys
>>> sys.getsizeof(t)
44
>>> sys.getsizeof(s)
40
>>> sys.getsizeof(t[0])
12
>>> sys.getsizeof(s[0])
12
>>> sys.getsizeof(())
28
와 같이 결과가 나온다. 위 결과를 보면 공 튜플은 28 바이트를 갖는 다는 것을 확인 할수 있고, 튜플에 정수가 추가됨에 따라 4 바이트가 추가 된다는 것을 알 수 있다.

그러나 정수 자체는 12 바이트를 가진다는 것을 확인 할 수도 있다.

이 차이는 아마도 정수 자체는 12 바이트지만, 튜플에 추가되는 것은 주소이므로 주소는 4 바이트를 가지기 때문일 것이다.

어쨌든, 튜플이 추가 되면서 정수 객체는 추가 되지 않지만 주소를 가지는 튜플이 새로 추가 되므로 메모리 사용이 40바이트가 추가 된다는 것을 알 수 있다.

댓글 없음:

댓글 쓰기