В настоящее время программа Python вызывает shutil.rmtree
когда заканчивается удаление большого количества файлов, которые создаются по мере их выполнения. Этот вызов занимает порядка ~ 20+ секунд. Я профилировал это с помощью cProfile, и почти все это время тратится на posix.remove calls.
Если я не удалю эти файлы как часть программы Python, а вместо этого вызову rm -rf
в папке после завершения выполнения программы, rm -rf
в <5 секунд.
Есть ли что-то особенное, что может вызвать огромную разницу во времени выполнения?
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)
Глядя на источник для rmtree
, он имеет много кода на Python, который выполняется в дополнение к минимальному количеству собственного кода. Многое это также обработка строк, которая делает несколько небольших эфемерных объектов. Сейчас у меня нет профиля, но я предполагаю, что большую часть времени тратится на тело цикла _rmtree_safe_fd
.