tqdm:迭代的简单循环,显示 MB/s

tqdm: simple loop on iterations, show MB/s

问题

我想在 n 次迭代中做一个简单的循环。每次迭代都包含一个复制操作,我知道复制了多少字节。我的问题是:如何在进度条中也显示 MB/s 的数量?

例子

我在 rsync 附近显示进度条。我修改了this answer如下:

import subprocess
import sys
import re
import tqdm

n = len(open('myfiles.txt').readlines())
your_command = 'rsync -aP --files-from="myfiles.txt" myhost:mysource .'
pbar = tqdm.trange(n)

process = subprocess.Popen(your_command, stdout=subprocess.PIPE, shell=True)
for line in iter(process.stdout.readline, ''):
    line = line.decode("utf-8")
    if re.match(r'(.*)(xfr\#)([0-9])(.*)(to\-chk\=)([0-9])(.*)', line):
        pbar.update()

其中 myfiles.txt 包含文件列表。这给了我一个很好的进度条,显示每秒的迭代次数。

但是,我匹配的摘要行表示文件已被复制,例如

  682,356 100%  496.92kB/s    0:00:01 (xfr#5, to-chk=16756/22445)

还包含复制的字节数,我想用它来显示复制速度。

下面我提供了您需要的代码。

因为我没有您的示例数据,所以我创建了简单的生成器函数来模拟检索数据的过程。它在随机时间点(每次迭代)生成等于随机字节数(不是兆字节)的值。

下面有两个 tqdm 条,一个用于进度,它测量每秒的迭代次数以及完成的迭代总数和百分比。第二个条形图以每秒兆字节数和接收的兆字节总数为单位测量速度。

Try it online!

import tqdm
def gen(cnt):
    import time, random
    for i in range(cnt):
        time.sleep(random.random() * 0.125)
        yield random.randrange(1 << 20)
total_iterations = 150
pbar = tqdm.tqdm(total = total_iterations, ascii = True)
sbar = tqdm.tqdm(unit = 'B', ascii = True, unit_scale = True)
for e in gen(total_iterations):
    pbar.update()
    sbar.update(e)

输出:

  9%|█████████▉                               | 89/1000 [00:11<01:53,  8.05it/s]
40.196MiB [00:11,  3.63MiB/s]

ASCII 视频 (+link):