Python shutil.rmtree вызов занимает очень много времени

1

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

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

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

Теги:

2 ответа

0

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

Эта информация является чем-то, что os.walk функция 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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню