본문 바로가기
Python

[파이썬] 메모리관리

by AI미남홀란드 2021. 1. 30.
728x90

** 파이썬의 변수는 인스턴스를 가르키는 이름

-> 변수에 새로운 데이터를 대입하는 것이 아니고 데이터가 차지한 공간에 이름을 붙히는 것.

-> 파이썬에서는 동일한 리터럴을 가르키는 변수를 2개 생성하면 2개 가리키는 공간이 같습니다.

 

#a에 1을 대입합니다

#1을 메모리에 저장하고 그 데이터 공간에 a라는 이름을 붙인 것입니다

a=1

#1이라는 리터럴이 존재하는지 확인하고 존재하면 그 공간에 b라는 이름도 붙횝니다.

b=1

#2개는 동일한 리터럴을 가리키기에 id가 같다.

print(id(a))

print(id(b))

 

a=2

print(id(a)) # 다른 리터럴을 가리키므로 idr가 바뀐다. 

print(id(b))

실행 결과: 4332841312  # 1의 값
                4332841312 # 1의 값을 공유 
                4332841344 # 2가 되버린 새로운 메모리
                4332841312 # b는 그대로 1의 값

 

2. 변수 사이의 대입

-> 변수를 다른 변수에 대입하면 데이터의 참조가 복사됩니다.

-> 1개인 데이터를 가르키는 변수를 대입하면 값이 복사된 것처럼 서로 간에 영향이 없습니다.

1개가 아닌 list , set ,tuple , dict , instance(클래스의 객체) 를 대입하면 참조가 복사된 것 처럼 동작하기 때문에

하나가 자신의 일부분을 변경하면 다른 변수에게도 영향을 줍니다.

되도록이면 이 동작은 하지 않는 것이 좋습니다.

 

a= 10

b= a # a가 스칼라 데이터라서 a값인 10을 b에 복사해주는 것과 같은 효과

print(a)

print(b)

#동일한 값이 출력됩니다.

10

10

 

b= 20

print(a)

print(b)

#b의 값을 변경해도 a에는 영향이 없습니다

10

10

10

20

#여러개의 데이터를 가진 변수를 복사하고 부분적으로 데이터를 수정하면

#원본에도 영향을 마치게 됩니다.

 

li1 = ['아이폰' , '아이폰xs' , '아이폰12','맥북']

li2 = li1

print(li1)

print(li2)

 

li2[0]= "맥북"

print(li1)

print(li2)

 

li3= li2

li3= ["갤럭시', '갤럭시버즈','갤럭시21,'갤럭시노트']

#li3 전체를 변경한 것입니다

#li2에 영향을 주지 않습니다

 

3. 얕은 복사(week copy) 와 같은 복사(deep copy)

1)얕은 복사

-> 여러 개의 데이터를 가진 데이터를 복사할 때 원본 데이터를 새로운 곳에 복사해서 대입해주는 것

얕은 복사를 하게되면 부분적으로 데이터를 수정했을 때 원본에 영향을 주지 않습니다.

copy 모듈 copy라는 함수를 이용해서 수행

 

li3=copy.copy(li3)

print('li1':li1)

"

"

동일한걸 볼 수 있다.

li2[0] = "HANA08"

print('li1:',li1)

print('li2:'li2)

copy 함수를 이용해서 복사 했기 때문에 완전히 새로운 데이터이기 때문에 li2 가 부분적으로

변경한것에 영향을 받지않는다

 

-> 얕은 복사는 재귀적으로 복제를 하지 않기 때문에 데이터의 모임 안에 다시 데이터의 모임이 있는 경우는 서로간에 영향을 주게 됩니다.

 

2) 깊은복사

-> 복사를 할 때 재귀적으로 복제를 해서 복사하는 방식

-> 데이터 모임 안에 데이터 모임이 있으면 이것도 다시 복제해서 복사하는 방식

-> 데이터를 새로운 곳에 완전히 복사해서 돌려주는 방식

-> copy.deepcopy 함수로 수행

-> 이렇게 복사가 되면 원본의 변화가 복사본에 영향을 주지 않고 복사본의 변화도 원본에 영향을 주지 않는다.

 

3) 참조 대입 , 얕은 복사 , 깊은 복사

-> 참조를 대입하게 되면 메모리는 절약할 수 있지만 프로그램의 코드를 파악하기가 어려워지고 유지보수가 어려워 집니다.

-> 깊은 복사를 하게 되면 메모리 사용량은 늘어나지만 , 서로간의 영향을 주지 않기 때문에 유지보수가 쉬워진다

-> 데이터 분석(AI,머신러닝) 분야등에서 하나의 데이터를 가지고 여러 번 작업을 수행해서 결과를 만들기 원본 데이터가 변경되는 것을 금기시 합니다. 되도록이면 깉은 복사를 권장합니다.

R 은 기본적으로 깊은 복사를 채택합니다.

python에서는 기본적으로 참조를 대입하는 형태로 대입을 하지만 numpy 나 pandas 패키지처럼 데이터 분석의 기본이 되는

패키지에서는 깊은 복사를 사용합니다.

 

GUI ( windows , android , ios 등) 프로그래밍에서 기본적으로 참조를 대입하는 형태로 동작합니다.

GUI 프로그램은 대부분 디자인을 XML 파일 같은 곳에서 하고 여기서 디자인 한 화면을 코드에서 다시 가져와서 사용한다.

디자인을 변경했을 때 코드에 바로 적용이 되도록 할려면 참조를 대입하는 형태로 해서 하나의 변경이 다른 하나에 바로 적용되어야 한다

 

4) 메모리 관리

-> 데이터를 생성하면 참조 카운트를 같이 생성해서 1을 대입합니다.

-> 다른 곳에 참조를 대입하면 참조 카운트가 1증가 합니다.

-> None을 대입하거나 자신을 생생한 영역이 종료되면 참조 카운트가 1 감소 합니다

 

-> 참조 카운트가 0이 되면 메모리에서 정리 대상이 되서 더 이상 사용할 수 없는 상태가 됩니다.

이런 메모리 관리가 중요한 곳은 스마트 폰 처럼 업그레이드가 안되는 기기의 프로그램이나 게임처럼 오랜시간 동안 작업을

수행하는 프로그램을 만들 때는 중요합니다.

 

5)weakref 모듈

-> 참조를 대입하는데 참조 카운트를 증가시키지 않고 대입하는 모듈입니다.

weakref.ref(데이터) 형태로 사용합니다.

스마트 폰 프로그래밍이 이런 방식으로 대입을 합니다.

 

 

728x90

'Python' 카테고리의 다른 글

[파이썬] 기본 네트워크 & 데이터 처리  (0) 2021.01.31
[파이썬] 자료규조  (0) 2021.01.31
[파이썬] 쓰레드  (0) 2021.01.30
[파이썬] 파이썬의 모듈  (0) 2021.01.30
[파이썬] 파이썬 정리2  (0) 2021.01.24