如何打印每秒迭代次数?

12

我有一个小Python脚本,它向服务器发送POST请求并获取它们的响应。

它迭代了10000次,并且我使用以下命令在命令提示符中打印了当前进度:

code=current_requestnumber
print('{0}/{1}'.format(str(code),"10000"),end="\r")

在每个循环的结尾。

由于这涉及与Web服务器的交互,因此我也想在旁边显示当前平均速度(每2秒更新一次)。

命令提示符底部的示例如下:

(1245/10000),6.3个请求/秒

我该如何实现这一点?


1
有人知道如何使用Python的progressbar2吗?如果解决方案出现在这里:https://github.com/WoLpH/python-progressbar/issues/250 - Charlie Parker
原始仓库的讨论链接:https://github.com/WoLpH/python-progressbar/discussions/253 - Charlie Parker
可能会有用的tqdm参考链接:https://github.com/tqdm/tqdm/discussions/1211 - Charlie Parker
6个回答

11

您可以像这样获得每秒事件总平均数:

#!/usr/bin/env python3

import time
import datetime as dt

start_time = dt.datetime.today().timestamp()
i = 0
while(True):
    time.sleep(0.1)
    time_diff = dt.datetime.today().timestamp() - start_time
    i += 1
    print(i / time_diff)
在这个示例中,将打印出大约10。请注意,我使用了Python 3中仅可用的datetime的timestamp方法。现在,如果您想计算过去10个事件中每秒发生的“当前”事件数,可以按以下方式执行:
#!/usr/bin/env python3

import time
import datetime as dt

last_time = dt.datetime.today().timestamp()
diffs = []
while(True):
    time.sleep(0.1)

    # Add new time diff to list
    new_time = dt.datetime.today().timestamp()
    diffs.append(new_time - last_time)
    last_time = new_time

    # Clip the list
    if len(diffs) > 10:
        diffs = diffs[-10:]

    print(len(diffs) / sum(diffs))

我在这里记录了最近10次迭代的持续时间,然后可以使用这些时间来计算每秒发生的事件的平均数量。


为什么我要这样做,进度条不是已经存在了吗? - Charlie Parker
@CharlieParker 因为看起来 OP 正试图获取“每秒请求数”,这是一个经典的 Web 框架基准测试。不是进度条... - dir

10
你可以使用 tqdm 库来实现这个功能。一个简单的示例是:
from tqdm import tqdm
for i in tqdm(range(1e20)):
    ##LOOP BODY
这将打印当前迭代次数、每秒迭代次数、预计完成时间以及一个漂亮的进度条。
例如。
 21%|████████████████████  21/100 [01:45<04:27,  3.39s/it]


你知道ProgressBar2的解决方案吗? - Charlie Parker

4
使用 python-progressbar2 库,您可以像这样完成:
import time
import progressbar


widgets = [
    progressbar.Percentage(),
    progressbar.Bar(),
    ' ', progressbar.SimpleProgress(),
    ' ', progressbar.ETA(),
    ' ', progressbar.AdaptiveTransferSpeed(unit='it'),
]

bar = progressbar.ProgressBar(widgets=widgets)
for i in bar(range(100)):
    time.sleep(0.2)
    bar.update(i)

这大概是你想要的:)
 19%|########                               | 19 of 100 ETA:   0:00:17   4.9 it/s

(免责声明:本人是python-progressbar2的作者和维护者)
注意:本翻译文本中保留了HTML标签,请勿删除。

1
在这里使用进度条2,以下是解决方案:
import time
import progressbar
widgets = [
    progressbar.Percentage(),
    ' ', progressbar.SimpleProgress(format=f'({progressbar.SimpleProgress.DEFAULT_FORMAT})'),
    ' ', progressbar.Bar(),
    ' ', progressbar.Timer(), ' | '
                              ' ', progressbar.ETA(), ' | ',
    ' ', progressbar.AdaptiveTransferSpeed(unit='it'),
]
bar = progressbar.ProgressBar(widgets=widgets)
for i in bar(range(100)):
    time.sleep(0.1)
    bar.update(i)
100% (100 of 100) |#####| Elapsed Time: 0:00:10 |  Time:  0:00:10 |    9.8 it/s

详情请参见讨论,感谢进度条2的维护者们提供的出色论坛:https://github.com/WoLpH/python-progressbar/discussions/253


1
计算完成的请求次数,并将其除以程序已执行的时间?
使用time.time可以获取时间。其余部分只需将当前请求编号除以自启动以来经过的秒数即可...这样你就得到了长期平均值。如果需要快速显示速度何时变化,就会变得更加复杂,因为您需要计算例如过去10秒钟内的请求数。 (一种方法是在距离上次重置超过10秒钟时重置计数器)

1

这取决于您的请求是同步发送还是异步发送。

对于同步发送,tqdm库提供所需的统计信息。

对于异步发送,您应该将请求发送代码包装在一个代码中,以保存发送每个请求所花费的时间,并作为回调更新全局对象,该对象保存统计信息并将其更新到屏幕上。 实现取决于您用于异步发送的库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接