Повышение производительности Python при уничтожении экземпляров внутри цикла for - PullRequest
0 голосов
/ 17 октября 2018

Я использую скрипт Python для чтения некоторых файлов ASCII, манипулирования их значениями и получения выходных данных.Расчет выполняется в экземпляре класса, что-то вроде псевдоформыпомеха или возможность сэкономить время и память?Размер проблемы велик (если не считать 1 миллион строк).

Мне ясно, что я предпочел бы читать из двоичного файла, но на данный момент это не работает.Кроме того, я выбираю конструкцию класса из-за элегантности и, возможно, по мере развития сценария я смогу получить больше преимуществ от инкапсуляции.Тем не менее, я мог бы отказаться от этого на этом этапе, если бы предложили это сделать.

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

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

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

0 голосов
/ 17 октября 2018

Зачем писать код psuedo, а не только python?В любом случае, в python удаление экземпляра класса не имеет смысла, если вы просто собираетесь переопределить имя новым циклом следующего экземпляра.Интерпретатор автоматически удалит объект из памяти, когда на него не будет сохранено никаких ссылок.

Таким образом, эти два параметра занимают почти одинаковое время (см. Ниже):

from collections import UserList

def with_del():
    for i in range(10000):
        x = UserList([i])
        del x

def without_del():
    for i in range(10000):
        x = UserList([i])

%timeit with_del()
8.19 ms ± 188 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit without_del()
8.04 ms ± 92.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

with_delвероятно, это займет немного больше времени, так как для выполнения требуется дополнительная инструкция байтового кода.

...