我有一个小的Python脚本,它将POST请求发送到服务器并获得响应。
迭代10000次,我设法使用以下命令在命令提示符下打印当前进度:
code=current_requestnumber
print('{0}/{1}'.format(str(code),"10000"),end="\r")
在每个循环结束时。
因为这涉及与网络服务器的互动,我想在此旁边显示当前的平均速度(每2秒更新一次)。
命令提示符底部的示例如下:
(1245/10000),6.3次/秒
我如何实现这一目标?
答案 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