Страницы

Поиск по вопросам

среда, 4 марта 2020 г.

Оценить время выполнения программы и вывести в реальном времени процент исполнения программы

#python


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

import os


def scan_dir(path):
    print('[',path,']')

    for file in os.listdir(path):
        file_path = os.path.join(path, file)
        if os.path.isfile(file_path):
            print('\t', file)
        else:
            scan_dir(file_path)

if __name__ == '__main__':
    scan_dir('C:\djangoProjects')

    


Ответы

Ответ 1



Всё просто: разбирить процесс на 2 стадии: Посчитать всё количество файлов в каталоге, который обходите — типа оценка времени. Собственно в цикле где работаете с файлами производить отчет, какой % обработан и сколько осталось — и согласно этому изменяете свой прогресс-бар. Но если вы прям хотите время выводить (приблизительное само собой, которое также может меняться): тоже нужно провести какую-то оценку. Нужно знать общий объем файлов, которые будут участвовать в обходу. И как как размер файлов разный можно, например, посчитать сколько времени уходит на обработку 5% файлов и на основе этого расчитать приблизительное оставшиеся время на обработку.

Ответ 2



Не зная заранее ни количество файлов ни сколько обработка выбранного файла может занять, вы не сможете узнать на ходу сколько осталось времени до конца выполнения программы. Часто хорошим предсказателем времени выполнения является время выполнения прошлого запуска. При первом запуске можно показывать просто абсолютные числа (количество просмотренных директорий, файлов, среднее время на файл). При последующих запусках, можно дополнить сравнением с прошлым, что может позволить оценить "сколько ещё ждать". К примеру, для задачи резервного копирования, если в прошлом запуске было обработано 1000 файлов, в среднем по минуте на каждый, а в текущем запуске вы на 900-ом файле, то можно написать, что оценочно ~90% сделано, осталось ~100 минут. Конечно, оценки будут ошибочными, если у вас вдруг стало 10000 файлов вместо 1000 на прошлом запуске. Если есть желание, то и при первом запуске можно оценить время выполнения. Если время обработки одного файла заметное и уже по одному количеству файлов ясно время выполнения, то можно вхолостую обойти всё дерево директорий как @Alexander Bragin предложил. Это не должно удваивать время на обход, так как OS кэширует информацию о файловой системе обычно (диск на порядки медленнее оперативной памяти как правило). Всё зависит от фактической задачи, какие предположения, которые могут помочь в оценке времени выполнения, являются верными в вашем конкретном случае.

Комментариев нет:

Отправить комментарий