如何打印每秒迭代次数?
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。请注意,我使用了 datetime
的 timestamp
方法,它仅在 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
我有一个小 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。请注意,我使用了 datetime
的 timestamp
方法,它仅在 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