tqdm
berasal dari kata Arab taqaddum (تقدّم) yang dapat berarti "kemajuan", dan merupakan singkatan dari "Aku sangat mencintaimu" dalam bahasa Spanyol ( te quiero demasiado ).
Buat loop Anda secara instan menunjukkan pengukur kemajuan yang cerdas - cukup bungkus semua iterable dengan tqdm(iterable)
, dan selesai!
from tqdm import tqdm
for i in tqdm ( range ( 10000 )):
...
76%|████████████████████████ | 7568/10000 [00:33<00:10, 229.00it/s]
trange(N)
juga dapat digunakan sebagai pintasan praktis untuk tqdm(range(N))
.
Itu juga dapat dieksekusi sebagai modul dengan pipa:
$ seq 9999999 | tqdm --bytes | wc -l
75.2MB [00:00, 217MB/s]
9999999
$ tar -zcf - docs/ | tqdm --bytes --total ` du -sb docs/ | cut -f1 `
> backup.tgz
32% | ██████████▍ | 8.89G/27.9G [00: 42< 01:31, 223MB/s]
Overhead rendah -- sekitar 60ns per iterasi (80ns dengan tqdm.gui
), dan merupakan unit yang diuji terhadap regresi kinerja. Sebagai perbandingan, ProgressBar yang sudah mapan memiliki overhead 800ns/iter.
Selain overhead yang rendah, tqdm
menggunakan algoritme cerdas untuk memprediksi waktu yang tersisa dan melewatkan tampilan iterasi yang tidak perlu, sehingga overhead dapat diabaikan dalam banyak kasus.
tqdm
bekerja pada platform apa pun (Linux, Windows, Mac, FreeBSD, NetBSD, Solaris/SunOS), di konsol apa pun atau di GUI, dan juga ramah dengan notebook IPython/Jupyter.
tqdm
tidak memerlukan dependensi apa pun (bahkan curses
!), hanya Python dan lingkungan yang mendukung karakter kontrol carriage return r
dan line feed n
.
Daftar isi
contrib
asyncio
logging
pip install tqdm
Tarik dan instal cabang devel
pra-rilis:
pip install " git+https://github.com/tqdm/tqdm.git@devel#egg=tqdm "
conda install -c conda-forge tqdm
Ada 3 saluran untuk dipilih:
snap install tqdm # implies --stable, i.e. latest tagged release
snap install tqdm --candidate # master branch
snap install tqdm --edge # devel branch
Perhatikan bahwa biner snap
murni untuk penggunaan CLI (tidak dapat import
), dan secara otomatis mengatur penyelesaian tab bash
.
docker pull tqdm/tqdm
docker run -i --rm tqdm/tqdm --help
Ada tempat lain (tidak resmi) di mana tqdm
dapat diunduh, khususnya untuk penggunaan CLI:
Daftar semua perubahan tersedia di Rilis GitHub:, di wiki, atau di situs web.
tqdm
sangat serbaguna dan dapat digunakan dalam beberapa cara. Tiga yang utama diberikan di bawah ini.
Bungkus tqdm()
di sekitar iterable apa pun:
from tqdm import tqdm
from time import sleep
text = ""
for char in tqdm ([ "a" , "b" , "c" , "d" ]):
sleep ( 0.25 )
text = text + char
trange(i)
adalah contoh khusus yang dioptimalkan dari tqdm(range(i))
:
from tqdm import trange
for i in trange ( 100 ):
sleep ( 0.01 )
Instansiasi di luar loop memungkinkan kontrol manual atas tqdm()
:
pbar = tqdm ([ "a" , "b" , "c" , "d" ])
for char in pbar :
sleep ( 0.25 )
pbar . set_description ( "Processing %s" % char )
Kontrol manual pembaruan tqdm()
menggunakan pernyataan with
:
with tqdm ( total = 100 ) as pbar :
for i in range ( 10 ):
sleep ( 0.1 )
pbar . update ( 10 )
Jika total
variabel opsional (atau iterable dengan len()
) disediakan, statistik prediktif akan ditampilkan.
with
juga bersifat opsional (Anda cukup menugaskan tqdm()
ke suatu variabel, namun dalam hal ini jangan lupa untuk del
atau close()
di akhir:
pbar = tqdm ( total = 100 )
for i in range ( 10 ):
sleep ( 0.1 )
pbar . update ( 10 )
pbar . close ()
Mungkin penggunaan tqdm
yang paling menakjubkan adalah dalam skrip atau pada baris perintah. Cukup memasukkan tqdm
(atau python -m tqdm
) di antara pipa akan melewati semua stdin
ke stdout
sambil mencetak kemajuan ke stderr
.
Contoh di bawah ini menunjukkan penghitungan jumlah baris di semua file Python di direktori saat ini, dengan informasi waktu disertakan.
$ time find . -name ' *.py ' -type f -exec cat { } ; | wc -l
857365
real 0m3.458s
user 0m0.274s
sys 0m3.325s
$ time find . -name ' *.py ' -type f -exec cat { } ; | tqdm | wc -l
857366it [00:03, 246471.31it/s]
857365
real 0m3.585s
user 0m0.862s
sys 0m3.358s
Perhatikan bahwa argumen biasa untuk tqdm
juga dapat ditentukan.
$ find . -name ' *.py ' -type f -exec cat { } ; |
tqdm --unit loc --unit_scale --total 857366 >> /dev/null
100% | █████████████████████████████████ | 857K/857K [00: 04< 00:00, 246Kloc/s]
Mencadangkan direktori besar?
$ tar -zcf - docs/ | tqdm --bytes --total ` du -sb docs/ | cut -f1 `
> backup.tgz
44% | ██████████████▊ | 153M/352M [00: 14< 00:18, 11.0MB/s]
Ini dapat dipercantik lebih lanjut:
$ BYTES= $( du -sb docs/ | cut -f1 )
$ tar -cf - docs/
| tqdm --bytes --total " $BYTES " --desc Processing | gzip
| tqdm --bytes --total " $BYTES " --desc Compressed --position 1
> ~ /backup.tgz
Processing: 100% | ██████████████████████ | 352M/352M [00: 14< 00:00, 30.2MB/s]
Compressed: 42% | █████████▎ | 148M/352M [00: 14< 00:19, 10.9MB/s]
Atau dilakukan pada level file menggunakan 7-zip:
$ 7z a -bd -r backup.7z docs/ | grep Compressing
| tqdm --total $( find docs/ -type f | wc -l ) --unit files
| grep -v Compressing
100% | ██████████████████████████▉ | 15327/15327 [01: 00< 00:00, 712.96files/s]
Program CLI yang sudah ada sebelumnya dan sudah mengeluarkan informasi kemajuan dasar akan mendapatkan manfaat dari tanda --update
dan --update_to
tqdm
:
$ seq 3 0.1 5 | tqdm --total 5 --update_to --null
100% | ████████████████████████████████████ | 5.0/5 [00: 00< 00:00, 9673.21it/s]
$ seq 10 | tqdm --update --null # 1 + 2 + ... + 10 = 55 iterations
55it [00:00, 90006.52it/s]
Masalah paling umum berkaitan dengan keluaran berlebihan pada banyak baris, bukan bilah kemajuan satu baris yang rapi.
CR
, r
).r
dengan benar (cloudwatch, K8s) mungkin mendapat manfaat dari export TQDM_POSITION=-1
.colorama
untuk memastikan bilah bersarang tetap berada dalam barisnya masing-masing.ascii
.tqdm
tidak.tqdm(enumerate(...))
dengan enumerate(tqdm(...))
atau tqdm(enumerate(x), total=len(x), ...)
. Hal yang sama berlaku untuk numpy.ndenumerate
.tqdm(zip(a, b))
dengan zip(tqdm(a), b)
atau bahkan zip(tqdm(a), tqdm(b))
.itertools
.tqdm.contrib
.docker-compose run
alih-alih docker-compose up
dan tty: true
.export TQDM_MININTERVAL=5
untuk menghindari spam log. Logika penggantian ini ditangani oleh dekorator tqdm.utils.envwrap
(berguna terlepas dari tqdm
).Jika Anda mengalami kesulitan lain, telusuri dan arsipkan .
(Sejak 19 Mei 2016)
class tqdm ():
"""
Decorate an iterable object, returning an iterator which acts exactly
like the original iterable, but prints a dynamically updating
progressbar every time a value is requested.
"""
@ envwrap ( "TQDM_" ) # override defaults via env vars
def __init__ ( self , iterable = None , desc = None , total = None , leave = True ,
file = None , ncols = None , mininterval = 0.1 ,
maxinterval = 10.0 , miniters = None , ascii = None , disable = False ,
unit = 'it' , unit_scale = False , dynamic_ncols = False ,
smoothing = 0.3 , bar_format = None , initial = 0 , position = None ,
postfix = None , unit_divisor = 1000 , write_bytes = False ,
lock_args = None , nrows = None , colour = None , delay = 0 ):
Dapat diubah untuk didekorasi dengan bilah kemajuan. Biarkan kosong untuk mengelola pembaruan secara manual.
Awalan untuk bilah kemajuan.
Jumlah iterasi yang diharapkan. Jika tidak ditentukan, len(iterable) digunakan jika memungkinkan. Jika float("inf") atau sebagai upaya terakhir, hanya statistik kemajuan dasar yang ditampilkan (tidak ada ETA, tidak ada bilah kemajuan). Jika gui
Benar dan parameter ini perlu diperbarui selanjutnya, tentukan angka positif awal yang besar dan sewenang-wenang, misalnya 9e9.
Jika [default: Benar], simpan semua jejak bilah kemajuan setelah penghentian iterasi. Jika None
, hanya akan keluar jika position
0
.
io.TextIOWrapper
atau io.StringIO
, opsional Menentukan tempat untuk menampilkan pesan kemajuan (default: sys.stderr). Menggunakan metode file.write(str)
dan file.flush()
. Untuk pengkodean, lihat write_bytes
.
Lebar seluruh pesan keluaran. Jika ditentukan, ubah ukuran bilah kemajuan secara dinamis agar tetap berada dalam batas ini. Jika tidak ditentukan, coba gunakan lebar lingkungan. Fallbacknya lebarnya 10 meter dan tidak ada batasan untuk penghitung dan statistik. Jika 0, tidak akan mencetak meteran apa pun (hanya statistik).
Interval pembaruan tampilan kemajuan minimum [default: 0,1] detik.
Interval pembaruan tampilan kemajuan maksimum [default: 10] detik. Secara otomatis menyesuaikan miniters
agar sesuai dengan mininterval
setelah jeda pembaruan tampilan yang lama. Hanya berfungsi jika dynamic_miniters
atau thread monitor diaktifkan.
Interval pembaruan tampilan kemajuan minimum, dalam iterasi. Jika 0 dan dynamic_miniters
, akan secara otomatis menyesuaikan ke mininterval
yang sama (lebih efisien CPU, bagus untuk loop ketat). Jika > 0, akan melewatkan tampilan jumlah iterasi yang ditentukan. Sesuaikan ini dan mininterval
untuk mendapatkan loop yang sangat efisien. Jika kemajuan Anda tidak menentu dengan iterasi cepat dan lambat (jaringan, melewatkan item, dll), Anda harus menyetel miniters=1.
Jika tidak ditentukan atau Salah, gunakan unicode (blok halus) untuk mengisi meteran. Penggantinya adalah menggunakan karakter ASCII " 123456789#".
Apakah akan menonaktifkan seluruh pembungkus bilah kemajuan [default: False]. Jika diatur ke Tidak Ada, nonaktifkan di non-TTY.
String yang akan digunakan untuk mendefinisikan unit setiap iterasi [default: it].
Jika 1 atau Benar, jumlah iterasi akan dikurangi/diskalakan secara otomatis dan awalan metrik yang mengikuti standar Sistem Satuan Internasional akan ditambahkan (kilo, mega, dll.) [default: False]. Jika ada angka bukan nol lainnya, akan menskalakan total
dan n
.
Jika disetel, terus-menerus mengubah ncols
dan nrows
ke lingkungan (memungkinkan pengubahan ukuran jendela) [default: False].
Faktor pemulusan rata-rata bergerak eksponensial untuk perkiraan kecepatan (diabaikan dalam mode GUI). Berkisar dari 0 (kecepatan rata-rata) hingga 1 (kecepatan saat ini/sesaat) [default: 0.3].
Tentukan pemformatan string bilah khusus. Dapat memengaruhi kinerja. [default: '{l_bar}{bar}{r_bar}'], dengan l_bar='{desc}: {persentase:3.0f}%|' dan r_bar='| {n_fmt}/{total_fmt} [{elapsed}<{remaining}, ' '{rate_fmt}{postfix}]' Kemungkinan vars: l_bar, bar, r_bar, n, n_fmt, total, total_fmt, persentase, elapsed, elapsed_s, ncols , sekarang, deskripsi, unit, tarif, rate_fmt, rate_noinv, rate_noinv_fmt, rate_inv, rate_inv_fmt, postfix, unit_divisor, sisa, sisa_s, eta. Perhatikan bahwa akhiran ": " secara otomatis dihapus setelah {desc} jika yang terakhir kosong.
Nilai penghitung awal. Berguna saat memulai ulang bilah kemajuan [default: 0]. Jika menggunakan float, pertimbangkan untuk menentukan {n:.3f}
atau serupa di bar_format
, atau menentukan unit_scale
.
Tentukan offset garis untuk mencetak bilah ini (mulai dari 0) Otomatis jika tidak ditentukan. Berguna untuk mengelola beberapa bar sekaligus (misalnya, dari thread).
*
, opsional Tentukan statistik tambahan untuk ditampilkan di akhir bilah. Memanggil set_postfix(**postfix)
jika memungkinkan (dict).
[default: 1000], diabaikan kecuali unit_scale
bernilai True.
Apakah akan menulis byte. Jika (default: False) akan menulis unicode.
Diteruskan untuk refresh
keluaran perantara (inisialisasi, iterasi, dan pembaruan).
Ketinggian layar. Jika ditentukan, sembunyikan bilah bertumpuk di luar batas ini. Jika tidak ditentukan, coba gunakan ketinggian lingkungan. Penggantinya adalah 20.
Warna batang (misalnya 'hijau', '#00ff00').
Jangan tampilkan hingga [default: 0] detik telah berlalu.
delim
ditentukan.delim
, dan unit_scale
default ke True, unit_divisor
ke 1024, dan unit
ke 'B'.stdin
ke stderr
dan stdout
.update()
. Perhatikan bahwa ini lambat (~2e5 it/s) karena setiap input harus diterjemahkan sebagai angka.self.n
. Perhatikan bahwa ini lambat (~2e5 it/s) karena setiap input harus diterjemahkan sebagai angka. class tqdm ():
def update ( self , n = 1 ):
"""
Manually update the progress bar, useful for streams
such as reading files.
E.g.:
>>> t = tqdm(total=filesize) # Initialise
>>> for current_buffer in stream:
... ...
... t.update(len(current_buffer))
>>> t.close()
The last line is highly recommended, but possibly not necessary if
``t.update()`` will be called in such a way that ``filesize`` will be
exactly reached and printed.
Parameters
----------
n : int or float, optional
Increment to add to the internal counter of iterations
[default: 1]. If using float, consider specifying ``{n:.3f}``
or similar in ``bar_format``, or specifying ``unit_scale``.
Returns
-------
out : bool or None
True if a ``display()`` was triggered.
"""
def close ( self ):
"""Cleanup and (if leave=False) close the progressbar."""
def clear ( self , nomove = False ):
"""Clear current bar display."""
def refresh ( self ):
"""
Force refresh the display of this bar.
Parameters
----------
nolock : bool, optional
If ``True``, does not lock.
If [default: ``False``]: calls ``acquire()`` on internal lock.
lock_args : tuple, optional
Passed to internal lock's ``acquire()``.
If specified, will only ``display()`` if ``acquire()`` returns ``True``.
"""
def unpause ( self ):
"""Restart tqdm timer from last print time."""
def reset ( self , total = None ):
"""
Resets to 0 iterations for repeated use.
Consider combining with ``leave=True``.
Parameters
----------
total : int or float, optional. Total to use for the new bar.
"""
def set_description ( self , desc = None , refresh = True ):
"""
Set/modify description of the progress bar.
Parameters
----------
desc : str, optional
refresh : bool, optional
Forces refresh [default: True].
"""
def set_postfix ( self , ordered_dict = None , refresh = True , ** tqdm_kwargs ):
"""
Set/modify postfix (additional stats)
with automatic formatting based on datatype.
Parameters
----------
ordered_dict : dict or OrderedDict, optional
refresh : bool, optional
Forces refresh [default: True].
kwargs : dict, optional
"""
@ classmethod
def write ( cls , s , file = sys . stdout , end = " n " ):
"""Print a message via tqdm (without overlap with bars)."""
@ property
def format_dict ( self ):
"""Public API for read-only member access."""
def display ( self , msg = None , pos = None ):
"""
Use ``self.sp`` to display ``msg`` in the specified ``pos``.
Consider overloading this function when inheriting to use e.g.:
``self.some_frontend(**self.format_dict)`` instead of ``self.sp``.
Parameters
----------
msg : str, optional. What to display (default: ``repr(self)``).
pos : int, optional. Position to ``moveto``
(default: ``abs(self.pos)``).
"""
@ classmethod
@ contextmanager
def wrapattr ( cls , stream , method , total = None , bytes = True , ** tqdm_kwargs ):
"""
stream : file-like object.
method : str, "read" or "write". The result of ``read()`` and
the first argument of ``write()`` should have a ``len()``.
>>> with tqdm.wrapattr(file_obj, "read", total=file_obj.size) as fobj:
... while True:
... chunk = fobj.read(chunk_size)
... if not chunk:
... break
"""
@ classmethod
def pandas ( cls , * targs , ** tqdm_kwargs ):
"""Registers the current `tqdm` class with `pandas`."""
def trange ( * args , ** tqdm_kwargs ):
"""Shortcut for `tqdm(range(*args), **tqdm_kwargs)`."""
def tqdm . contrib . tenumerate ( iterable , start = 0 , total = None ,
tqdm_class = tqdm . auto . tqdm , ** tqdm_kwargs ):
"""Equivalent of `numpy.ndenumerate` or builtin `enumerate`."""
def tqdm . contrib . tzip ( iter1 , * iter2plus , ** tqdm_kwargs ):
"""Equivalent of builtin `zip`."""
def tqdm . contrib . tmap ( function , * sequences , ** tqdm_kwargs ):
"""Equivalent of builtin `map`."""
class tqdm . notebook . tqdm ( tqdm . tqdm ):
"""IPython/Jupyter Notebook widget."""
class tqdm . auto . tqdm ( tqdm . tqdm ):
"""Automatically chooses beween `tqdm.notebook` and `tqdm.tqdm`."""
class tqdm . asyncio . tqdm ( tqdm . tqdm ):
"""Asynchronous version."""
@ classmethod
def as_completed ( cls , fs , * , loop = None , timeout = None , total = None ,
** tqdm_kwargs ):
"""Wrapper for `asyncio.as_completed`."""
class tqdm . gui . tqdm ( tqdm . tqdm ):
"""Matplotlib GUI version."""
class tqdm . tk . tqdm ( tqdm . tqdm ):
"""Tkinter GUI version."""
class tqdm . rich . tqdm ( tqdm . tqdm ):
"""`rich.progress` version."""
class tqdm . keras . TqdmCallback ( keras . callbacks . Callback ):
"""Keras callback for epoch and batch progress."""
class tqdm . dask . TqdmCallback ( dask . callbacks . Callback ):
"""Dask callback for task progress."""
contrib
Paket tqdm.contrib
juga berisi modul eksperimental:
tqdm.contrib.itertools
: Pembungkus tipis di sekitar itertools
tqdm.contrib.concurrent
: Pembungkus tipis di sekitar concurrent.futures
tqdm.contrib.slack
: Posting ke bot Slacktqdm.contrib.discord
: Posting ke bot Discordtqdm.contrib.telegram
: Posting ke bot Telegramtqdm.contrib.bells
: Secara otomatis mengaktifkan semua fitur opsionalauto
, pandas
, slack
, discord
, telegram
help()
; Informasi khusus dapat ditampilkan dan diperbarui secara dinamis pada bilah tqdm
dengan argumen desc
dan postfix
:
from tqdm import tqdm , trange
from random import random , randint
from time import sleep
with trange ( 10 ) as t :
for i in t :
# Description will be displayed on the left
t . set_description ( 'GEN %i' % i )
# Postfix will be displayed on the right,
# formatted automatically based on argument's datatype
t . set_postfix ( loss = random (), gen = randint ( 1 , 999 ), str = 'h' ,
lst = [ 1 , 2 ])
sleep ( 0.1 )
with tqdm ( total = 10 , bar_format = "{postfix[0]} {postfix[1][value]:>8.2g}" ,
postfix = [ "Batch" , { "value" : 0 }]) as t :
for i in range ( 10 ):
sleep ( 0.1 )
t . postfix [ 1 ][ "value" ] = i / 2
t . update ()
Hal-hal yang perlu diingat ketika menggunakan {postfix[...]}
dalam string bar_format
:
postfix
juga perlu diteruskan sebagai argumen awal dalam format yang kompatibel, danpostfix
akan dikonversi secara otomatis menjadi string jika itu adalah objek seperti dict
. Untuk mencegah perilaku ini, masukkan item tambahan ke dalam kamus yang kuncinya bukan string. Parameter bar_format
tambahan juga dapat ditentukan dengan mengganti format_dict
, dan bilah itu sendiri dapat dimodifikasi menggunakan ascii
:
from tqdm import tqdm
class TqdmExtraFormat ( tqdm ):
"""Provides a `total_time` format parameter"""
@ property
def format_dict ( self ):
d = super (). format_dict
total_time = d [ "elapsed" ] * ( d [ "total" ] or 0 ) / max ( d [ "n" ], 1 )
d . update ( total_time = self . format_interval ( total_time ) + " in total" )
return d
for i in TqdmExtraFormat (
range (