2012-11-12 2 views
1

은 변수 이름을 다시 사용하는 것이 좋습니다.메모리를 절약하기 위해 Python에서 이름을 다시 사용하기

foo = Spam() 
bar = foo.eggs() 

그리고 동의합니다. 코드를 읽을 수있게합니다.

변수가 40MB의 데이터 인 경우 어떻게됩니까? 그것 자체를 복사하고 총 80 MB 의가?

foo = buffer # 40 MB. 
bar = foo.resize((50, 50)) # +40? 

나는 기능이 실행됩니다 때 메모리가 해제됩니다 알아,하지만 난 여전히 그것은 단지 때문에 가독성을 응용 한 상태에서 두 배 이상 메모리 사용량처럼 가지고하는 것이 좋습니다 생각하지 않습니다. 특수한 경우와 같지만 특별한 경우는 특별하지 않습니다.

답변

5

파이썬 할당은 참조 값을 대상 객체로 복사합니다. 데이터 복사가 없습니다. Python 변수는 Python 시스템 사전에있는 이름과 객체에 대한 참조 값인 값입니다.

실제로 할당에주의해야합니다. 파이썬 할당은 참조 값을 공유한다는 의미입니다. 파이썬 할당은 대상 객체를 복사하는 것을 결코 의미하지 않습니다. 문자열이나 숫자와 같은 변경 불가능한 객체로 작업 할 때 아무런 문제가 나타나지 않을 수 있습니다. 그러나 임의의 변경 가능 개체 (목록, 사전, 집합, 일부 사용자 개체)를 할당하면 대상 개체에 다른 이름 (참조 값의 다른 복사본을 통한 액세스) 만 제공한다는 것을 알아야합니다.

함수/메소드 인수로 객체를 전달할 때도 마찬가지입니다.

+0

파이썬에는 "변수"같은 것이 없습니다. 그것의 모든 참조. – Ber

+0

사실입니다 만, 복사가 일어날 수있는 유일한 장소는 아닙니다.'foo.resize'는 그 결과를 반환합니다. 즉, 내부 버퍼에서 새로운 버퍼를 생성하고 반환합니다. 이것은 실제로 그 데이터가 두 번 존재할 수 있음을 의미합니다. – lvc

+0

나는 본다. 그러나 질문에는 공유 인 'foo = buffer'가 포함되어 있습니다. '.resize'는 뾰족한 타겟의 메소드입니다. 나는 그것이 정확히 무엇을하는지 모른다. 'bar'가 질문의 핵심이라면,'bar'가 가리키는 더 이른 목표는 해제되고'bar'는 다른 목적을 위해 재사용됩니다. – pepr

4

당신이 절대적으로 데이터가 완전히 전에 메모리 당신이 (에만 관심있는 비트 읽기보다는) 크기를 조정하는 것이 있어야하는 경우, 당신은이 작업을 수행 할 수 있습니다 동등

foo = buffer() 
bar = foo.resize((50, 50)) 
del foo 

또는 :

bar = buffer().resize((50, 50)) 

이 코드를 실행하면 바로 buffer의 결과가 가비지 수집에 즉시 적용됩니다.

또한이 경우 변수 이름을 즉시 재사용 할 수 있습니다. 코드에서 코드가 바로 뒤 따르는 경우 특히 foo.resize이 foo와 같은 유형의 객체를 반환하는 경우) :

foo = buffer 
foo = foo.resize((50, 50)) 

은 완벽합니다. 충고는 완전히 관련이없는 변수의 이름을 다시 사용하지 않는 것입니다. 따라서 코드를 읽는 사람이 변수를 볼 수 있고 처음에 할당 된 곳으로 건너 뛰고 그 내용을 이해할 수 있습니다. 그들 중 하나가 관심있는 실제 대상을 얻는 일회성 "디딤돌 (stepping stone)"일 때 독자를 혼란시킬 사소한 위험이 있습니다.

+0

델을 잘 사용하면 대형 객체로 작업 할 때 gc의 사용되지 않은 객체를 일찍 확보하면 성능이 크게 달라질 수 있습니다. 특히 gc가 중간 기능을 수집 할 수있는 다중 스레드 코드에서 실. 이것은 생성되고 폐기되는 데이터가 목록이거나 이와 유사하며 메모리 절감 효과는 말할 것도 없습니다. – Perkins

관련 문제