2014-02-17 7 views
1

Ниже я создаю список из Any экземпляров, затем я изменяю этот список и, наконец, я случайно выбрал некоторые элементы этого списка, чтобы создать новый список.Избегайте утечки памяти

from random import choice 
import copy 

class Any(): 
    def __init__(self,x): 
     self.x=x 

    def modify (self): 
     self.x += choice([0,1]) 
     return self 

def create_new_list (old_list): 
    new_list = [copy.deepcopy(old_list[choice(range(len(old_list)))]) for i in range(len(old_list))] 
    return new_list 


a = [Any(0),Any(19),Any(3),Any(10)] # Create the original list 
for iteration in xrange(20): 
    [i.modify() for i in a] 
    a = create_new_list(a) 
  1. Я обязан копировать элементы старого списка, как я тогда хочу изменить их независимо друг от друга. Правильно ли это?

  2. Из-за этой системы, я создаю в каждом цикле новые экземпляры Any, которые будут храниться в памяти, что приведет к проблеме утечки памяти. Правильно ли это?

  3. Как я могу избежать этого?

    3a) Что делать, если добавить

    дель old_list

    в конце функции create_new_list?

    3b) Или я должен добавить

    [дель (я) для г в old_list]

    дель old_list

    в конце create_new_list?

    3c) Есть ли еще более эффективное решение?

+0

Утечка памяти, когда выделенная память не отпущена. У Python есть сбор мусора, поэтому утечка памяти невозможна. – StoryTeller

+0

Первый экземпляр списка 'a' имеет право на выпуск или сбор мусора, как только вы перестанете ссылаться на него, т. Е. Когда вы назначаете список, возвращенный из' create_new_list', на 'a'. Нет утечки. – Useless

ответ

1

В вашем случае нет, вам ничего не нужно копировать.

Кроме того, вам не нужно явно освобождать что-либо. Вещи будут собираться с мусором, когда они больше не ссылаются.

+0

Хм, я не совсем понимаю. Все экземпляры Any, которые не присутствуют в новом списке. Что с ними происходит? Они берут память, не так ли? Они будут собирать мусор. Означает ли это, что они будут стерты из памяти? Как долго не нужно ссылаться на экземпляр, прежде чем он войдет в сборку мусора? –

+0

Коллекция мусора Python удаляет объекты из памяти, когда больше ничего не ссылается на них (т. Е. Обычный метод сбора мусора). Подробности о том, когда Python делает сборку мусора, несколько связаны, но хорошо описаны. См. Здесь: http://stackoverflow.com/questions/4484167/details-how-python-garbage-collection-works. В общем, слишком много беспокоиться о сборке мусора - обычно ошибка на языке Python. Профилируйте свой код и посмотрите, где возникают реальные проблемы. – Namey

+0

@Namey Большое спасибо за ваш комментарий! –

Смежные вопросы