Python: «утек» ли установленный класс при удалении элементов, как дикт? - PullRequest
4 голосов
/ 28 февраля 2010

Я знаю, что Python dict s будет "протекать" при удалении элементов (потому что слот элемента будет перезаписан магическим значением "удалено") ... Но будет ли класс set вести себя так же? Безопасно ли хранить 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.

Ответы [ 2 ]

7 голосов
/ 28 февраля 2010

Да, set - это, по сути, хеш-таблица, такая же, как dict - различия в интерфейсе не подразумевают много различий "ниже". Время от времени вы должны копировать набор - myset = set(myset) - точно так же, как вы делаете это для указания, по которому с течением времени регулярно производится множество добавлений и удалений.

0 голосов
/ 28 февраля 2010

Для подобных вопросов часто лучше провести быстрый эксперимент, подобный этому, и посмотреть, что произойдет:

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

То, что говорят люди и документы, и какое поведение на самом деле часто противоречат друг другу. Если это важно для вас, проверьте это. Не полагайтесь на других.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...