Bagaimana cara menggunakan bilah kemajuan saat skrip saya melakukan beberapa tugas yang mungkin akan memakan waktu?
Misalnya, fungsi yang membutuhkan waktu untuk diselesaikan dan kembali True
saat selesai. Bagaimana saya bisa menampilkan bilah kemajuan selama fungsi dijalankan?
Perhatikan bahwa saya perlu ini dalam waktu nyata, jadi saya tidak tahu apa yang harus saya lakukan. Apakah saya memerlukan thread
ini? Saya tidak punya ide.
Saat ini saya tidak sedang mencetak apa-apa saat fungsi sedang dieksekusi, tetapi progress bar akan lebih baik. Saya juga lebih tertarik pada bagaimana hal ini dapat dilakukan dari sudut pandang kode.
Jawaban:
Ada perpustakaan tertentu ( seperti ini di sini ) tetapi mungkin sesuatu yang sangat sederhana akan dilakukan:
Catatan: progressbar2 adalah cabang dari progressbar yang belum dipelihara selama bertahun-tahun.
sumber
NameError: name 'xrange' is not defined
kesalahan. Apakah saya kehilangan modul?xrange
adalah Python 3range
.print('■', end='', flush=True)
Dengan tqdm Anda dapat menambahkan pengukur kemajuan ke loop Anda dalam sedetik:
Juga, ada versi grafis tqdm sejak
v2.0.0
(d977a0c
):Tapi hati-hati, karena
tqdm_gui
dapat meningkatkanTqdmExperimentalWarning: GUI is experimental/alpha
, Anda dapat mengabaikannya dengan menggunakanwarnings.simplefilter("ignore")
, tetapi itu akan mengabaikan semua peringatan dalam kode Anda setelah itu.sumber
__len__
properti atau pengguna harus memberikantotal
argumentqdm
. Selain itu, bilah akan berfungsi tetapi tanpa ETA.from tqdm import tqdm_notebook as tqdm
. Kalau tidak, jangan tulis di satu baris.Saran di atas cukup bagus, tapi saya pikir kebanyakan orang hanya ingin solusi yang sudah jadi, tanpa ketergantungan pada paket eksternal, tetapi juga dapat digunakan kembali.
Saya mendapatkan poin terbaik dari semua di atas, dan membuatnya menjadi fungsi, bersama dengan test case.
Untuk menggunakannya, cukup salin baris di bawah "def update_progress (progress)" tetapi bukan skrip pengujian. Jangan lupa untuk mengimpor sys. Sebut ini setiap kali Anda perlu menampilkan atau memperbarui bilah progres.
Ini berfungsi dengan mengirim simbol "\ r" langsung ke konsol untuk memindahkan kursor kembali ke awal. "print" dengan python tidak mengembalikan simbol di atas untuk tujuan ini, maka kita perlu 'sys'
Inilah yang ditunjukkan hasil skrip uji (Bilah progres terakhir menjiwai):
sumber
in range(101)
tidak 100, progres berhenti pada 99% dan tidak pernah menampilkan selesai.Jawaban ini tidak bergantung pada paket eksternal , saya juga berpikir bahwa kebanyakan orang hanya ingin sepotong kode yang sudah jadi . Kode di bawah ini dapat diadaptasi agar sesuai dengan kebutuhan Anda dengan menyesuaikan: simbol progres
'#'
barsize
, bar , teksprefix
dll.Pemakaian:
Keluaran:
Tidak memerlukan utas kedua . Beberapa solusi / paket di atas memerlukan. Utas kedua dapat menjadi masalah,
jupyter notebook
misalnya, misalnya.Bekerja dengan semua iterable itu berarti apa saja yang
len()
dapat digunakan. Alist
,dict
apa pun misalnya['a', 'b', 'c' ... 'g']
Anda juga dapat mengubah output dengan mengubah file ke
sys.stderr
misalnyasumber
TypeError: object of type 'generator' has no len()
generators
) Anda harus membungkusnya dengan alist()
. Sepertifor i in progressbar(list(your_generator), "Computing: ", 40):
untuk aplikasi yang serupa (melacak kemajuan dalam satu lingkaran) Saya cukup menggunakan python-progressbar :
Contoh mereka seperti ini,
sumber
progressbar2
paket. Kode di atas akan bekerja dengannya.import *
?Coba kemajuan dari https://pypi.python.org/pypi/progress .
Hasilnya akan menjadi bar seperti berikut:
sumber
progress
membuat bilah yang bagus, tetapi gagal jika perangkat lunak lain memanipulasistderr
. maaf, tapi saya belum menyelidiki masalah sebenarnya.Saya baru saja membuat kelas kemajuan sederhana untuk kebutuhan saya setelah mencari di sini untuk solusi yang setara. Saya pikir saya mungkin mempostingnya.
Contoh:
Akan mencetak yang berikut:
[======== ] 17/80 ( 21%) 63 to go
sumber
progress.current
tambahan di akhir__call__
untuk membatasi interaksi dengan objek dari kode utama lebih.Saya suka jawaban Brian Khuu karena kesederhanaannya dan tidak membutuhkan paket eksternal. Saya mengubahnya sedikit jadi saya menambahkan versi saya di sini:
Dibutuhkan jumlah total run (
total
) dan jumlah run yang diproses sejauh ini (progress
) dengan asumsitotal >= progress
. Hasilnya terlihat seperti ini:sumber
Anda dapat menggunakan tqdm :
Dalam contoh ini bilah kemajuan berjalan selama 5 menit dan ditampilkan seperti itu:
Anda dapat mengubahnya dan menyesuaikannya sesuka Anda.
sumber
Untuk menggunakan kerangka bilah kemajuan apa pun dengan cara yang bermanfaat, yaitu untuk mendapatkan persentase kemajuan aktual dan perkiraan ETA, Anda harus dapat mendeklarasikan berapa banyak langkah yang harus dilakukan.
Jadi, fungsi komputasi Anda di utas lain, apakah Anda dapat membaginya dalam beberapa langkah logis? Bisakah Anda memodifikasi kodenya?
Anda tidak perlu memperbarui atau memecahnya dalam metode aktual, Anda bisa meletakkan beberapa strategi
yield
di beberapa tempat di dalamnya! Jika fungsi yang mahal memiliki for loop , cukup masukkan satu di dalamnya. Anda hanya harus tahu pada akhirnya berapa banyak hasil yang akan dilakukan, untuk mendapatkan hasil terbaik.Dengan begitu, fungsi Anda bisa seperti ini:
atau ini:
Dengan fungsi semacam itu, Anda dapat menginstal:
Dan gunakan seperti:
Untuk mendapatkan progress-bar yang keren!
Penafian: Saya penulis Live_Progress, tetapi harus menyelesaikan masalah Anda dengan baik. Baca dokumentasi di https://github.com/rsalmei/alive-progress , berikut adalah contoh apa yang dapat dilakukannya:
sumber
Saya sangat suka python-progressbar , karena sangat mudah digunakan.
Untuk kasus yang paling sederhana, itu hanya:
Penampilannya dapat disesuaikan dan dapat menampilkan perkiraan sisa waktu. Sebagai contoh, gunakan kode yang sama seperti di atas tetapi dengan:
sumber
Jika itu adalah loop besar dengan jumlah iterasi tetap yang membutuhkan banyak waktu Anda dapat menggunakan fungsi ini saya buat. Setiap iterasi loop menambahkan kemajuan. Di mana hitungan adalah iterasi saat ini dari loop, total adalah nilai yang Anda looping ke dan ukuran (int) adalah seberapa besar Anda ingin bar dalam penambahan 10 yaitu (ukuran 1 = 10 karakter, ukuran 2 = 20 karakter)
contoh:
keluaran:
sumber
Gunakan perpustakaan ini:
fish
( GitHub ).Pemakaian:
Selamat bersenang-senang!
sumber
Kode di bawah ini adalah solusi yang cukup umum dan juga memiliki waktu yang berlalu dan perkiraan sisa waktu. Anda bisa menggunakan iterable dengannya. Bilah progres memiliki ukuran tetap 25 karakter tetapi dapat menampilkan pembaruan dalam langkah 1% menggunakan karakter blok penuh, setengah, dan seperempat. Outputnya terlihat seperti ini:
Kode dengan contoh:
Saran untuk perbaikan atau komentar lainnya dihargai. Bersulang!
sumber
Saya suka halaman ini .
Mulai dengan contoh sederhana dan beralih ke versi multi-utas. Bekerja di luar kotak. Tidak diperlukan paket pihak ketiga.
Kode akan terlihat seperti ini:
Atau di sini adalah contoh untuk menggunakan utas untuk menjalankan bilah pemintalan saat program sedang berjalan:
sumber
Ini cukup mudah di Python3:
sumber
Saat berjalan di notebook jupyter penggunaan tqdm normal tidak berfungsi, karena ia menulis keluaran pada banyak baris. Gunakan ini sebagai gantinya:
sumber
Jika pekerjaan Anda tidak dapat dipecah menjadi potongan yang terukur, Anda dapat memanggil fungsi Anda di utas baru dan berapa lama waktu yang dibutuhkan:
Anda jelas dapat meningkatkan ketepatan waktu sesuai kebutuhan.
sumber
Saya suka jawaban Gabriel , tetapi saya mengubahnya agar fleksibel. Anda dapat mengirim panjang bar ke fungsi dan mendapatkan progress bar dengan panjang yang Anda inginkan. Dan Anda tidak dapat memiliki bilah progres dengan panjang nol atau negatif. Anda juga dapat menggunakan fungsi ini seperti jawaban Gabriel (Lihat Contoh # 2).
Hasil:
sumber
Saya menggunakan
format()
metode untuk membuat bar beban. Ini solusinya:Keluaran:
sumber
Berikut solusi singkat yang membuat bilah pemuatan secara terprogram (Anda harus memutuskan berapa lama Anda menginginkannya).
sumber
Coba PyProg. PyProg adalah pustaka sumber terbuka untuk Python untuk membuat indikator & bilah kemajuan yang dapat disesuaikan.
Saat ini di versi 1.0.2; di-host di Github dan tersedia di PyPI (Tautan di bawah). Ini kompatibel dengan Python 3 & 2 dan juga dapat digunakan dengan Qt Console.
Ini sangat mudah digunakan. Kode berikut:
akan menghasilkan:
Saya benar-benar membuat PyProg karena saya membutuhkan pustaka kemajuan sederhana namun super dapat dikustomisasi. Anda dapat dengan mudah menginstalnya dengan:
pip install pyprog
.PyProg Github: https://github.com/Bill13579/pyprog
PyPI: https://pypi.python.org/pypi/pyprog/
sumber
Anda juga dapat menggunakan mencerahkan . Keuntungan utama adalah Anda dapat login pada saat yang sama tanpa menimpa bilah kemajuan Anda.
Ini juga menangani beberapa progress bar.
sumber
Gunakan perpustakaan kemajuan !
Berikut adalah subkelas khusus yang saya tulis untuk memformat ETA / Elapsed times menjadi format yang lebih baik dibaca:
sumber
Ini solusi sederhana saya:
sumber
Anda harus menautkan bilah progres ke tugas yang ada (sehingga mengukur progres: D). Sebagai contoh, jika Anda sedang FTP file, Anda dapat memberitahu ftplib untuk mengambil buffer ukuran tertentu, misalkan 128K, dan kemudian Anda menambahkan ke progress bar Anda berapa pun persentase dari filesize 128k mewakili. Jika Anda menggunakan CLI, dan meteran kemajuan Anda sepanjang 20 karakter, Anda akan menambahkan satu karakter ketika 1/20 file telah ditransfer.
sumber
@ Massagran: Ini berfungsi baik di program saya. Selanjutnya, kita perlu menambahkan penghitung untuk menunjukkan waktu loop. Penghitung ini berperan sebagai argumen metode
update
. Misalnya: baca semua baris file tes dan perlakukan mereka pada sesuatu. Misalkan fungsidosth()
tersebut tidak terkait dengan variabeli
.Variabel
i
mengontrol statuspbar
via metodeupdate
sumber
jawaban yang sedikit lebih umum dari jelde015 (kredit kepadanya tentu saja)
untuk memperbarui bilah pemuatan secara manual adalah:
dan menyebutnya dengan:
akan menghasilkan:
panggil saja kapan saja Anda mau dengan nilai saat ini
i
.atur
size
jumlah chars yang seharusnyasumber
Kira saya sedikit terlambat tetapi ini harus bekerja untuk orang-orang yang bekerja dengan versi python 3 saat ini, karena ini menggunakan "f-string" , seperti yang diperkenalkan dalam Python 3.6 PEP 498 :
Kode
Contoh
Keluaran
sumber
Ini adalah cara sederhana untuk membuat progressbar
sumber