Python chat: удаление переменных для очистки памяти в функциях?


Я создаю демон чата в python и twisted framework. И мне интересно, должен ли я удалять каждую переменную, созданную в моих функциях, чтобы сохранить память в долгосрочной перспективе, когда подключены несколько пользователей, или эти переменные автоматически очищаются?. Вот сокращенная версия моего кода, чтобы проиллюстрировать мою точку зрения:

class Chat(LineOnlyReceiver):

    LineOnlyReceiver.MAX_LENGTH = 500

    def lineReceived(self, data):

            self.sendMessage(data)

    def sendMessage(self, data):

            try:
                message = data.split(None,1)[1]
            except IndexError:
                return

            self.factory.sendAll(message)

            #QUESTION : do i have to delete message and date??????????????????

            del message
            del data


class ChatFactory(Factory):
    protocol = Chat

    def __init__(self):
        self.clients = []

    def addClient(self, newclient):
        self.clients.append(newclient)

    def delClient(self, client):
        self.clients.remove(client)

    def sendAll(self, message):
        for client in self.clients:
            client.transport.write(message + "n")
3 11

3 ответа:

C Python (ссылочная реализация) использует подсчет ссылок и сборку мусора. Когда количество ссылок на объект уменьшается до 0, он автоматически восстанавливается. Сборка мусора обычно восстанавливает только те объекты, которые ссылаются друг на друга (или другие объекты из них), и поэтому не может быть восстановлена путем подсчета ссылок.

Таким образом, в большинстве случаев локальные переменные восстанавливаются в конце функции, поскольку при выходе из функции объекты перестают быть ссылаться из любого места. Так что ваши утверждения " del " совершенно излишни, потому что Python делает это в любом случае.

Объекты Python никогда не удаляются явно. Единственный способ по-настоящему освободить память от несвязанных объектов Python - это использовать сборщик мусора. Ключевое слово del просто отсоединяет имя от объекта, но объект все равно должен быть собран мусором.

Если вы действительно считаете, что это необходимо, вы можете заставить сборщик мусора работать с помощью gc модуль, но это почти наверняка преждевременная оптимизация, и вы, скорее всего, будете собирать мусор в самый неподходящий момент. раз или иначе неэффективно, если Вы действительно не знаете, что делаете.

Использование del, как указано выше, не имеет никакого реального эффекта, поскольку эти имена были бы удалены, поскольку они все равно вышли бы за пределы области действия. Вам нужно будет выполнить явную сборку мусора, чтобы быть уверенным(r).

Python использует сборку мусора. Это означает, что вам не нужно заботиться о памяти, поскольку она освобождается автоматически, когда она больше не используется.