12
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

コンソールにプログレスバーと残り時間を表示(python)

Last updated at Posted at 2017-05-09

#【追記】2017/05/10
表題の件について,tqdmなるパッケージを紹介していただきました.試用したところ,自前でstdoutを叩くのがアホらしくなるくらい負荷が軽く以後愛用しそうです.

stdoutをループ処理する場合のオーバーヘッドが嫌いなので間引くのが面倒なのは勘弁って感じでしたが,まったくもって杞憂でした.おためしあれ.

_tqdm.py見ればusageそのまんまですが,さっくり試用してみたい方へ
2.x系のひとはxrangeでどうぞ.

> python -m pip install tqdm

>>> from tqdm import tqdm
>>>
>>> for _ in tqdm(range(0x100000)):
>>>     pass

以下は寄せていただいたコメントを除き,駄文となります.

進捗と残り時間の表示

学習用のトレーニングセットを成型する作業が数万件規模になって来たので,カウントダウンしてくれる機能が欲しくなってきた.
てきとうな実装を探してみても,なんか違うのででっちあげた.

> progbar.py
  24% |#######-------------------------|  0:12:06
 100% |################################|  0:00:00

終了予定の時間が可視化できたのでちょっと楽ちん.
機械学習のトレーニングループにも良い感じ.

仕様

  • 繰り返し処理での利用を想定
  • 進捗率から終了時間を概算
  • 精度は気にしたら負け

実装

windows環境下でのみ動作確認.

progbar.py
import sys, time

class progbar:
    def __init__(self, period=100, bars=32):
        self._period  = period
        self.bars     = bars
        self.active   = True
        self.start    = time.time()

    def dispose(self):
        if self.active:
            self.active = False
            self.update(self._period)
            sys.stdout.write("\n")

    def __del__(self):
        self.dispose()

    def __enter__(self):
        return self

    def __exit__(self, type, value, traceback):
        self.dispose()

    def period(self):
        return self._period

    def update(self, tick):
        rate = tick / self._period

        # progress rate
        str = "{0:7d}% ".format(int(rate*100))

        # progress bar
        bar_prog = int(rate * self.bars)
        str += "|"
        str += "#" * (            bar_prog)
        str += "-" * (self.bars - bar_prog)
        str += "|"

        # calc end
        elapsed = time.time() - self.start
        predict = (elapsed * (1 - rate) / rate) if not rate == 0.0 else 0
        s = int(predict)
        m, s = divmod(s, 60)
        h, m = divmod(m, 60)
        d, h = divmod(h, 24)
        str += "{0:3d}:{1:02d}:{2:02d}\r".format(h,m,s)

        sys.stdout.write(str)

def main():
    # how to use
    with progbar(500) as pb:
        for i in range(pb.period()):
            time.sleep(0.01)
            if i % 10 == 0:
                pb.update(i)
    
if __name__ == '__main__':
    main()

# 時刻表示が力業ですな.

12
18
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?