2016-12-15 351 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

我還沒有想出如何使用內置ZIP對象使用tqdm。
這種情況的用例是使用控制檯進度條遍歷兩個相應的列表。
例如,我希望這個工作:

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

,但印在這種情況下,控制檯的進度是不正確的: enter image description here

一種解決方法是用枚舉使用tqdm,但此後必須定義和管理迭代器索引。

回答

2

tqdm可以搭配如果在tqdm調用中提供了'total'關鍵字參數,則爲zip。

以下示例演示對兩個列表中的對應元素進行迭代,其中工作爲tqdm progressbar用於使用'total'關鍵字參數的情況。 enter image description here

問題是tqdm需要提前知道迭代的長度。由於zip旨在處理具有不同長度的迭代器,因此它不具有單個長度參數的屬性。

所以,tqdm仍然適用於zip,你只需要提供一個用'total'關鍵字參數的小手動控制。

2

因爲你有一個進度條,預計你可以預測你的數據結構的長度。

range實現hook method__len__,所以你可以發現在內置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() 

編輯:

是的,就是這樣。看docs

...

包裝列舉iterables:使用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()一個變量,但 在這種情況下,不要在最後不忘delclose()

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

感謝這篇文章。它幫助找出一種方法來初始化tqdm,使用「總」關鍵字參數來使它與zip一起工作。 –