如何每秒打印迭代次数?

时间:2015-06-14 21:27:15

标签: python performance loops cmd progress

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

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

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

在每个循环结束时。

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

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

(1245/10000),6.3次/秒

我如何实现这一目标?

6 个答案:

答案 0 :(得分:7)

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

#!/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个。请注意,我使用了timestamp datetime方法,该方法仅适用于Python 3。

现在,如果您想计算每秒事件的“当前”数量,比如过去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次迭代的持续时间列表,然后我可以使用它来获取每秒的平均事件数。

答案 1 :(得分:3)

使用 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 :(得分:2)

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

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

这将显示当前迭代,每秒迭代,ETA和良好的进度条

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

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

time.time对于获取时间非常有用。其余的只是将current_requestnumber除以启动后的秒数差异... 这样你就获得了长期平均值。如果你需要快速显示速度变化,它会变得有点复杂,因为你需要计算最后10秒的请求数。 (一种方法是在上次复位后超过10秒时重置计数器)

答案 5 :(得分:0)

在此处使用进度条 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