在循环过程中,每x秒输出值的最佳/最有效的方法是什么

2024-04-25 23:24:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直对此很好奇,因为简单的方法绝对没有效率。如何有效地每x秒输出一个值?你知道吗

下面是我的意思的一个例子:

import time
num = 50000000

startTime = time.time()
j=0
for i in range(num):
    j = (((j+10)**0.5)**2)**0.5
print time.time() - startTime

#output time: 24 seconds


startTime = time.time()
newTime = time.time()
j=0
for i in range(num):
    j = (((j+10)**0.5)**2)**0.5
    if time.time() - newTime > 0.5:
        newTime = time.time()
        print i
print time.time() - startTime

#output time: 32 seconds

如果不每半秒输出一次进度,速度会快1/3。你知道吗

我知道这是因为每个循环都需要额外的计算,但这同样适用于您可能希望执行的其他类似检查—您将如何在不严重影响执行时间的情况下执行类似的操作?你知道吗


Tags: 方法inimportforoutputiftimerange
3条回答

我试过用边带线来打印。它在Python2.x上增加了5秒的执行时间,但实际上在Python3.x上没有额外的时间。Python2.x线程有很多开销。下面是我的例子,时间安排作为注释:

import time
import threading


def showit(event):
    global i # could pass in a mutable object instead
    while not event.is_set():
        event.wait(.5)
        print 'value is', i

num = 50000000

startTime = time.time()
j=0
for i in range(num):
    j = (((j+10)**0.5)**2)**0.5
print time.time() - startTime

#output time: 23 seconds

event = threading.Event()
showit_thread = threading.Thread(target=showit, args=(event,))
showit_thread.start()

startTime = time.time()
j=0
for i in range(num):
    j = (((j+10)**0.5)**2)**0.5
event.set()
time.sleep(.1)
print time.time() - startTime

#output time: 28 seconds

通过跟踪下一次打印的到期时间,可以节省一些时钟周期

nexttime = time.time() + 0.5

然后你的情况将是一个简单的比较

If time.time()  >= nexttime

而不是先减法再比较

If time.time() - newTime > 0.5

你只需要在每条信息之后做加法,而不是在每条信息之后做减法

好吧,你知道你每秒钟要做很多次迭代,所以你真的不需要每次迭代都进行time.time()调用。您可以使用模运算符来实际检查是否需要在循环的每N次迭代中输出一些内容。你知道吗

startTime = time.time()
newTime = time.time()
j=0
for i in range(num):
    j = (((j+10)**0.5)**2)**0.5
    if i % 50 == 0:  # Only check every 50th iteration
        if time.time() - newTime > 0.5:
            newTime = time.time()
            print i, newTime
print time.time() - startTime
# 45 seconds (the original version took 42 on my system)

每50次迭代检查一次,我的运行时间就从56秒减少到了43秒(原来的运行时间是42秒,而Tom Page的解决方案是50秒),迭代完成得足够快,根据time.time(),它仍然精确地每0.5秒输出一次:

0 1409083225.39
605000 1409083225.89
1201450 1409083226.39
1821150 1409083226.89
2439250 1409083227.39
3054400 1409083227.89
3644100 1409083228.39
4254350 1409083228.89
4831600 1409083229.39
5433450 1409083229.89
6034850 1409083230.39
6644400 1409083230.89
7252650 1409083231.39
7840100 1409083231.89
8438300 1409083232.39
9061200 1409083232.89
9667350 1409083233.39
...

相关问题 更多 >