2016-12-15 13 views
2

tqdm - это модуль Python, который позволяет легко распечатывать в консоли динамически обновляемую панель прогресса. Напримерtqdm progressbar и zip встроенный не работают вместе

from tqdm import tqdm 
from time import sleep 
for _ in tqdm(range(10)): 
    sleep(0.1) 

печатает динамический прогрессбар в консоли для 1сек, как итерация выполняет: enter image description here

Я не понял, как использовать tqdm с встроено объектом почтового индекса.
В качестве примера можно использовать итерацию по двум соответствующим спискам с помощью панели прогресса консоли.
К примеру, я бы ожидать, что это работает:

for _, _ in tqdm(zip(range(10), range(10))): 
    sleep(0.1) 

но прогрессбар выводимой на консоль в данном случае не является правильным: enter image description here

Обойти это можно использовать tqdm с Перечислим, однако затем индекс итератора должен быть определен и управляться.

ответ

2

tqdm может быть использован с zip, если в вызове tqdm предоставляется аргумент ключевого слова «total».

Следующий пример демонстрирует итерацию по соответствующим элементам в двух списках с рабочим tqdm progressbar для случая, когда используется аргумент ключевого слова 'total'. enter image description here

Вопрос заключается в том, что tqdm должен знать длину итерации досрочно. Поскольку zip предназначен для обработки итераций с разной длиной, он не имеет в качестве атрибута одну длину своих аргументов.

Итак, tqdm все еще хорошо работает с zip, вам просто нужно предоставить небольшой ручный контроль с аргументом ключевого слова «total».

2

У вас есть индикатор выполнения, который позволяет прогнозировать длину вашей структуры данных.

range реализует hook method__len__, так что вы можете открыть для себя длину Doing встроенный len

>>> dir(range(10)) 
[ '__le__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index', 'start', 'step', 'stop'] 

>>> len(range(10)) 
10 

zip, однако, не обеспечивает способ угадать длину обернутой структуры, так что, вероятно, именно поэтому потому что tqdm не может отображать индикатор выполнения.

dir(zip(range(10))) # no __len__ here 
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__'] 

>>> len(zip(range(10))) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: object of type 'zip' has no len() 

Edit:

Да, это так. Посмотрите на docs

...

Оберточные перечислимых итерируемых: использовать enumerate(tqdm(...)) вместо tqdm(enumerate(...)). То же самое относится к numpy.ndenumerate. Это , потому что функции enumerate имеют тенденцию скрывать длину итераций. tqdm нет.

...

Ручного управления на tqdm() обновлений, используя with заявление:

with tqdm(total=100) as pbar: 
    for i in range(10): 
     pbar.update(10) 

Если дополнительные переменные общие (или итерацию с len()) является при условии, отображается прогностические статистики ,

with также является необязательным (вы можете просто присвоить tqdm() переменной, но в этом случае не забудьте del или close() в конце:

pbar = tqdm(total=100) 
for i in range(10): 
    pbar.update(10) 
pbar.close() 
+0

Спасибо за сообщение. Это помогло выяснить способ инициализации tqdm с помощью «общего» аргумента ключевого слова, который заставляет его работать с zip. –