Python shutil.rmtree вызов занимает очень много времени - PullRequest
0 голосов
/ 14 сентября 2018

У меня в настоящее время есть вызов программы Python shutil.rmtree, когда он завершает удаление большого количества файлов, которые создаются при выполнении.Этот вызов занимает порядка ~ 20 + секунд.Я профилировал это с помощью cProfile, и почти все это время уходит на вызовы posix.remove.

Если я не удаляю эти файлы как часть программы Python, а вместо этого вызываю rm -rf в папке после завершения выполнения программы, rm -rf выполняется в течение <5 секунд.</p>

Есть ли что-то конкретное, что может вызывать такую ​​огромную разницу во времени выполнения?

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

shutil.rmtree делает системный вызов os.stat для каждой записи файла, через которую он проходит, чтобы определить, является ли это файл или каталог, что является огромной тратой времени, поскольку эта информация уже получена, когда каталог указан в списке.

Эта информация используется в функции os.walk (подробнее см. PEP-471 ), с помощью которой вы можете самостоятельно реализовать rmtree:

import os
def rmtree(directory):
    for root, dirs, files in os.walk(directory, topdown=False):
        for file in files:
            os.remove(os.path.join(root, file))
        for dir in dirs:
            os.rmdir(os.path.join(root, dir))
    os.rmdir(directory)
0 голосов
/ 14 сентября 2018

Глядя на исходный код для rmtree, он содержит много кода на Python, который выполняется в дополнение к минимальному объему собственного кода.Во многом это также обработка строк, которая создает несколько маленьких эфемерных объектов.У меня сейчас нет удобного профиля, но я думаю, что большую часть времени тратят в теле цикла _rmtree_safe_fd.

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