如何打印每秒迭代次数?

How to print iterations per second?

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

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

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

在每个循环结束时。

因为这涉及到与网络服务器的交互,所以我也想在旁边显示当前的平均速度(每 2 秒更新一次)。

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

(1245/10000), 6.3 requests/second

我该如何实现?

计算完成的请求并将其除以程序已经执行的时间?

time.time 将有助于获得时间。剩下的只是 current_requestnumber 除以自开始以来的秒数差异... 这样你就可以获得长期平均值。如果您需要快速显示速度何时发生变化,它会变得有点复杂,因为您需要计算最近 10 秒的请求数。 (一种方法是在自上次重置后超过 10 秒后重置计数器)

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

#!/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。请注意,我使用了 datetimetimestamp 方法,它仅在 Python 3.

中可用

现在,如果您想计算每秒 "current" 个事件数,比如最近 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 次迭代的持续时间列表,然后我可以使用它来获取每秒的平均事件数。

您可以为此使用 tqdm 库。一个简单的例子是

from tqdm import tqdm
for i in tqdm(range(1e20)):
    ##LOOP BODY

这将打印当前迭代,iterations/second,ETA 和一个漂亮的进度条

例如

 21%|████████████████████  21/100 [01:45<04:27,  3.39s/it]

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

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

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

使用 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 的作者和维护者)

这里使用进度条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

有关详细信息,请参阅讨论,感谢 progressbar 2 的维护者拥有的精彩论坛:https://github.com/WoLpH/python-progressbar/discussions/253