Улучшение индикатора выполнения tqdm, когда я знаю размеры "блоков" на каждой итерации - PullRequest
0 голосов
/ 29 мая 2020

Я чувствую, что есть простой способ делать то, что я хочу здесь, но я не нахожу его. У меня есть одна функция, которая обрабатывает файл и извлекает структуру данных pythoni c, скажем DataFrame. У меня есть еще одна функция, которая находит кучу файлов разного размера и возвращает итератор обработанным объектам, которые затем пользователи l oop превышают.

from .io import extract_dataset

def load_data(*args, **kwargs):
    files = find_files(*args, **kwargs)
    return map(extract_dataset, files)

for dataset in load_data(foo='bar'):
    do_some_analysis(dataset)

Теперь я хотел бы предоставить приятный индикатор выполнения. Наивно, что я мог бы сделать

def load_data(*args, **kwargs):
    files = find_files(*args, **kwargs)
    return map(extract_dataset, tqdm(files))

Это нормально, но это сложно, потому что файлы имеют разные размеры. Я хотел бы указать размер файла на индикаторе выполнения для каждого l oop. Я не могу изменить extract_dataset, который ожидает строк, а не файловых объектов, поэтому я не думаю, что могу использовать tqdm.wrapattr. Думаю, я мог бы сделать:

def load_data(*args, **kwargs):
    files = find_files(*args, **kwargs)
    totalsize = sum(getfilesize(f) for f in files)
    with tqdm(total=totalsize) as pbar:
        for f in files:
            pbar.update(getfilesize(f))
            yield extract_dataset(f)

Эстетически мне нравится map лучше, чем for...yield, но есть ли разница в остальном?

Если я сделаю это, когда pbar объект go выйдет из области видимости и будет очищен? Например, что, если итератор никогда не исчерпывается, но пользователь делает что-то вроде

mydataset = next(load_data())

. Тогда pbar остается на неопределенное время? Что, если мне придется использовать pbar в функции закрытия?

...