tqdm: время извлечения прошло + время осталось? - PullRequest
0 голосов
/ 20 июня 2019

Я просматривал документы tqdm , но независимо от того, куда я смотрю, я не могу найти метод, с помощью которого можно извлечь прошедшее время и предполагаемое оставшееся время полей (в основном центр индикатора выполнения в каждой строке: 00:00<00:02).

 0%|          | 0/200 [00:00<?, ?it/s]
  4%|▎         | 7/200 [00:00<00:02, 68.64it/s]
  8%|▊         | 16/200 [00:00<00:02, 72.87it/s]
 12%|█▎        | 25/200 [00:00<00:02, 77.15it/s]
 17%|█▋        | 34/200 [00:00<00:02, 79.79it/s]
 22%|██▏       | 43/200 [00:00<00:01, 79.91it/s]
 26%|██▌       | 52/200 [00:00<00:01, 80.23it/s]
 30%|███       | 61/200 [00:00<00:01, 82.13it/s]
....
100%|██████████| 200/200 [00:02<00:00, 81.22it/s]

tqdm работает по сути путем печати динамического индикатора выполнения в любое время, когда происходит обновление, но есть лиспособ «просто» напечатать части 00:01 и 00:02, чтобы я мог использовать их в других местах моей программы на Python, например, в автоматической остановке кода, который останавливает процесс, если он занимает слишком много времени?

1 Ответ

1 голос
/ 20 июня 2019

tqdm не раскрывает эту информацию как часть своего открытого API, и я не рекомендую пытаться взломать вашу собственную. Тогда вы будете зависеть от деталей реализации tqdm, которые могут измениться в любое время.

Однако это не должно помешать вам писать свои собственные. Достаточно просто установить цикл с таймером, и затем вы можете прервать цикл, если это займет слишком много времени. Вот быстрый грубый пример, который все еще использует tqdm для обеспечения визуальной обратной связи:

import time
from tqdm import tqdm


def long_running_function(n, timeout=5):
    start_time = time.time()

    for _ in tqdm(list(range(n))):
        time.sleep(1)  # doing some expensive work...
        elapsed_time = time.time() - start_time
        if elapsed_time > timeout:
            raise TimeoutError("long_running_function took too long!")


long_running_function(100, timeout=10)

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


Если вы хотите быть умным, вы можете даже выделить это в tqdm -обертной оболочке, подобной этой:

def timed_loop(iterator, timeout):
    start_time = time.time()
    iterator = iter(iterator)

    while True:
        elapsed_time = time.time() - start_time
        if elapsed_time > timeout:
            raise TimeoutError("long_running_function took too long!")

        try:
            yield next(iterator)
        except StopIteration:
            pass


def long_running_function(n, timeout=5):
    for _ in timed_loop(tqdm(list(range(n))), timeout=timeout):
        time.sleep(0.1)


long_running_function(100, timeout=5)
...