AdaptiveTransferSpeed

AdaptiveTransferSpeed averages transfer speed over a short window.

Reach for it when the transfer rate fluctuates and FileTransferSpeed, which averages over the whole run, reacts too slowly to the swings. The windowed average only fills in once several updates have landed more than a fraction of a second apart. Until then it renders “0.0 B/s”.

class progressbar.widgets.AdaptiveTransferSpeed(**kwargs: Any)[source]

Bases: FileTransferSpeed, SamplesMixin

Widget for showing the transfer speed based on the last X samples.

Create an AdaptiveTransferSpeed (see FileTransferSpeed).

Example

AdaptiveTransferSpeed
"""``AdaptiveTransferSpeed`` averages transfer speed over a short window.

Reach for it when the transfer rate itself fluctuates and a plain
``FileTransferSpeed`` -- which averages over the whole run -- reacts too
slowly to those swings. The windowed average only fills in once several
updates have landed more than a fraction of a second apart, so this
example runs longer and sleeps longer per step than most in this set;
without that, it would render '0.0 B/s' the whole way through.
"""

import random
import time

import progressbar

random.seed(0)

STEPS = 30


def main() -> None:
    widgets = [
        progressbar.Percentage(),
        ' ',
        progressbar.Bar(),
        ' ',
        progressbar.AdaptiveTransferSpeed(),
    ]
    max_value = 30_000_000
    with progressbar.ProgressBar(max_value=max_value, widgets=widgets) as bar:
        transferred = 0
        for _ in range(STEPS):
            transferred += random.randint(500_000, 2_000_000)
            bar.update(min(transferred, max_value))
            time.sleep(0.02)


if __name__ == '__main__':
    main()

See also