标杆
我写了不同的解决方案并加以比较。我需要将你的价值乘以10来获得可测量的结果。首先没有任何进度测量,看看它在我的机器上运行得有多快。
def process_without_measuring(self):
self._start = time.time()
self._k = 0
while self._k < 100000000:
self._k = self._k+1
print (time.time() - self._start)
我得到13.8秒的持续时间。
让我们先从您的实现:
def process_with_original_measuring(self):
self._start = time.time()
next = self._start
self._k = 0
while self._k < 100000000:
self._k = self._k+1
if time.time() - next > 1:
print (round((self._k/1000000), 5))
next = time.time()
print("duration:")
print (time.time() - self._start)
如果我跑,我得到的30.31秒和大约3百分比高达每秒的持续时间。问题是它必须比较每一个循环的时间,并进行一次算术运算。
def process_with_manual_measuring(self):
self._start = time.time()
next = self._start + 1
self._k = 0
while self._k < 100000000:
self._k = self._k+1
if time.time() > next:
print (round((self._k/1000000), 5))
next = time.time() + 1
print("duration:")
print (time.time() - self._start)
而是减去每一个循环我计算下一个时间戳只有一次,并比较它的时间戳:您可以通过更改循环的时间缩短。这当然不是很快,但比以前更快。它让我到22.0秒,因此只需要移除这一操作即可节省8秒。
具有定时对象的线程你得到一个更好的结果,它是最好的方法:
def show_progress(self):
print (round((self._k/1000000), 5))
self._timer = Timer(1, self.show_progress)
self._timer.start()
def process_with_timer(self):
self._start = time.time()
self._timer = Timer(1, self.show_progress)
self._timer.start()
self._k = 0
while self._k < 100000000:
self._k = self._k+1
self._timer.cancel()
print("duration:")
print (time.time() - self._start)
运行此我得到的7%以上每一秒,它是做了输出13.8秒后。正如你所看到的,没有区别。只有几个电话要做,而且几乎没有时间完成。
如何使用Timer类
的Timer
构造预计秒的持续时间和时间流逝之后调用的方法。您可以使用类方法,函数或lambda表达式。施工后,您需要启动计时器start()
。
第一个计时器由进程本身启动。在每次定时器调用之后,启动一个新的定时器以获得一秒的间隔。当进程结束时记得在定时器上调用cancel()
。否则它会无休止地运行,因为它会每秒重新启动。
如何运行示例
请注意,上述方法是类方法使腕表缩进。
import time
from threading import Timer
class ProgressMeter:
def __init__(self):
self._k = 0
self._timer = 0
# insert above methods with indentation as same level as __init__(self):
要运行它们,只需要创建一个ProgressMeter实例并调用所需的方法即可。
meter = ProgressMeter()
meter.process_with_timer()
没有试过这个实现,但会像这样的工作? https://docs.python.org/2/library/threading.html#timer-objects – Tom
也许你可以将计算包装到某种“Task”类中,并让另一个线程定期检查该任务的状态。虽然有点模糊。 –
取决于处理器。你有多少核心?我试图第二个例子上一个imac,它显示输出'39.0 79.0 2.53144' 我想这花了2.53s – pbu