2010-02-28 2 views
4

아이템이 제거 될 때 파이썬 dict이 "누출"한다는 것을 안다. (아이템의 슬롯은 마법의 "제거 된"값으로 덮어 쓰기 때문에) ... 그러나 set 클래스는 같은 방식으로 동작 할까? set을 계속 지키고 시간이 지남에 따라 물건을 추가하고 제거하는 것이 안전합니까?Python : dict와 같이 항목이 제거되면 set 클래스가 "누출"합니까?

편집는 : 좋아, 나는 그것을 밖으로 시도하고, 여기에 내가 무엇을 발견했습니다

 
>>> import gc 
>>> gc.collect() 
0 
>>> nums = range(1000000) 
>>> gc.collect() 
0 
### rsize: 20 megs 
### A baseline measurement 
>>> s = set(nums) 
>>> gc.collect() 
0 
### rsize: 36 megs 
>>> for n in nums: s.remove(n) 
>>> gc.collect() 
0 
### rsize: 36 megs 
### Memory usage doesn't drop after removing every item from the set… 
>>> s = None 
>>> gc.collect() 
0 
### rsize: 20 megs 
### … but nulling the reference to the set *does* free the memory. 
>>> s = set(nums) 
>>> for n in nums: s.remove(n) 
>>> for n in nums: s.add(n) 
>>> gc.collect() 
0 
### rsize: 36 megs 
### Removing then re-adding keys uses a constant amount of memory… 
>>> for n in nums: s.remove(n) 
>>> for n in nums: s.add(n+1000000) 
>>> gc.collect() 
0 
### rsize: 47 megs 
### … but adding new keys uses more memory. 
+3

파이썬의 dicts가 "누설 될"것이라고 말하면 무슨 뜻인지 실연 해 주시겠습니까? 다른 출처에 대한 참조일까요? –

+2

AFAIK dicts는 실제로 새어 나가지 않습니다 - 때때로 (예를 들어 새 항목을 설정할 때) 제거 된 값을 대체하는 더미가 제거됩니다 –

답변

7

예, set은 기본적으로 그냥 dict 같은 해시 테이블 - 인터페이스 돈 '의 차이 많은 차이를 "아래에"암시합니다. 가끔씩 많은 추가 및 제거가 정기적으로 이루어 지도록하는 것과 마찬가지로 - myset = set(myset) 세트를 복사해야합니다. 이와 같은 질문

+0

그래서 누출 된 부분이 누출됩니까? –

+1

@Anurag, dict는 장기간 실행되는 프로그램에서 키를 계속 추가하거나 제거하면 메모리 사용량이 증가하고 작업 속도가 느려질 수 있습니다. –

+2

"leak"는 지나치게 단순화하고 오해의 소지가 있습니다.하지만 중요한 것은 높은 churn dict이나 set에 대해 새로운 복사본을 만드는 것이 메모리를 절약하고 * 속도를 향상시킬 수 있다는 것입니다. –

-1

는 이와 같은 빠른 실험을 실행하고 어떻게되는지하는 것이 가장 좋습니다 : 문서 사람들이 말을하고 어떤 행동을 실제로 확률에서 종종 어떤

s = set() 
for a in range(1000): 
    for b in range(10000000): 
    s.add(b) 
    for b in range(10000000): 
    s.remove(b) 

. 이것이 중요한 경우 테스트하십시오. 다른 사람들에게 의존하지 마십시오.

+0

레코드의 경우 해당 코드에서 누수가 없음을 알 수 없습니다. 메모리 사용량이 한 번 뛰어 오른 다음 평평하게 유지되었습니다. –

+0

정상적으로 나는 동의 할 것이다. 그러나 말하고있는 사람이 Alex Martelli 일 때, 나는 앞으로 나아가 그를 믿을 것이다. –

+0

예, 그게 문제입니다. 결국 (모든 물건이 제거 된 후에) 다시 떨어집니다. GC화된 언어이기 때문에 매립 될 수있는 모든 메모리가 언제 회수되었는지를 아는 것이 더 어렵습니다. –

관련 문제