Как узнать, сколько времени займет поиск файлов на python? - PullRequest
3 голосов
/ 17 октября 2019

Итак, у меня есть небольшое приложение, которое ищет все файлы xml на моем компьютере, копируя файлы с 44 цифрами в качестве имени файла в папку «output».

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

Это модуль для копирования файлов:

xml_search.py ​​

import os
import re
from threading import Thread
from datetime import datetime
import time
import shutil
import winsound

os.system('cls')

def get_drives():
    response = os.popen("wmic logicaldisk get caption")
    list1 = []
    t1 = datetime.now()
    for line in response.readlines():
        line = line.strip("\n")
        line = line.strip("\r")
        line = line.strip(" ")
        if (line == "Caption" or line == ""):
            continue
        list1.append(line + '\\')
    return list1


def search1(drive):
    for root, dir, files in os.walk(drive):
        for file in files:
            if re.match("\d{44}.xml", file):
                filename = os.path.join(root, file)
                try:
                    shutil.copy(filename, os.path.join('output', file))
                except Exception as e:
                    pass

def exec_(callback):
    t1 = datetime.now()
    list2 = []   # empty list is created
    list1 = get_drives()
    for each in list1:
        process1 = Thread(target=search1, args=(each,))
        process1.start()
        list2.append(process1)

    for t in list2:
        t.join()  # Terminate the threads

    t2 = datetime.now()
    total = str(t2-t1)
    print(total, file=open('times.txt', 'a'), end="\n")
    for x in range(3):
        winsound.Beep(2000,100)
        time.sleep(.1)
    callback()


if __name__ == "__main__":
    exec_()

Ответы [ 2 ]

2 голосов
/ 20 октября 2019

В приведенном ниже коде используется библиотека progressbar , и она показывает

индикацию хода и оставшегося времени выполнения задачи

import progressbar
from time import sleep

bar = progressbar.ProgressBar(maxval=1120, \
    widgets=[progressbar.Bar('=', '[', ']'), ' ', progressbar.ETA()])
bar.start()
for i in range(1120):
    bar.update(i+1)
    sleep(0.1)
bar.finish()

Youпотребуется добавить вышеупомянутый модифицированный код в ваш код. Поэтому в вашем случае вам нужно будет подсчитать количество файлов и предоставить его в качестве входных данных для аргумента ProgressBar конструктора * и удалить вызов sleep.

Предлагаемое решение с индикатором выполнения должно работать содна нитьВам нужно будет выяснить, как запускать индикатор выполнения и куда помещать обновления, если вы настаиваете на работе с несколькими потоками.

0 голосов
/ 20 октября 2019

Попробуйте реализовать декоратор таймера следующим образом:

import time


def mytimer(func):
    def wrapper():
        t1 = time.time()
        result = func()
        t2 = time.time()
        print(f"The function {func.__name__} was run {t2 - t1} seconds")
        return result

    return wrapper

@mytimer
def TimeConsumingFunction():
    time.sleep(3)
    print("Hello timers")

TimeConsumingFunction()

Вывод:

/usr/bin/python3.7 /home/user/Documents/python-workspace/timers/example.py
Hello timers
The function TimeConsumingFunction was run 3.002610206604004 seconds

Process finished with exit code 0
...