# A stopwatch class.
from datetime import datetime
from time import perf_counter as _tic
class Stopwatch:
def __init__(self):
self.reset()
def reset(self):
self.toc = 0
self.run = False
def start(self):
assert not self.run
self.run = True
self.toc = self.elapsed()
def stop(self):
assert self.run
self.toc = self.elapsed()
self.run = False
def elapsed(self):
return _tic() - self.toc if self.run else self.toc
def __str__(self):
d = datetime.fromtimestamp(self.elapsed()).time()
f = int(d.microsecond/1E+6*100)
return '{:02d}:{:02d}:{:02d}.{:02d}'.format(d.hour,d.minute,d.second,f)
# .
from time import sleep
sw = Stopwatch()
print(sw) # = 00.00
sw.start()
print(sw) # ~ 00.00
sleep(0.5)
print(sw) # ~ 00.50
sw.stop()
sleep(0.5)
print(sw) # ~ 00.50
sw.start()
sleep(0.5)
print(sw) # ~ 01.00
sw.reset()
print(sw) # = 00.00
sw.start()
sleep(1)
print(sw) # ~ 01.00
IyBBIHN0b3B3YXRjaCBjbGFzcy4KCmZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lCmZyb20gdGltZSBpbXBvcnQgcGVyZl9jb3VudGVyIGFzIF90aWMKCmNsYXNzIFN0b3B3YXRjaDoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLnJlc2V0KCkKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgc2VsZi50b2MgPSAwCiAgICAgICAgc2VsZi5ydW4gPSBGYWxzZQoKICAgIGRlZiBzdGFydChzZWxmKToKICAgICAgICBhc3NlcnQgbm90IHNlbGYucnVuCiAgICAgICAgc2VsZi5ydW4gPSBUcnVlCiAgICAgICAgc2VsZi50b2MgPSBzZWxmLmVsYXBzZWQoKQoKICAgIGRlZiBzdG9wKHNlbGYpOgogICAgICAgIGFzc2VydCBzZWxmLnJ1bgogICAgICAgIHNlbGYudG9jID0gc2VsZi5lbGFwc2VkKCkKICAgICAgICBzZWxmLnJ1biA9IEZhbHNlCgogICAgZGVmIGVsYXBzZWQoc2VsZik6CiAgICAgICAgcmV0dXJuIF90aWMoKSAtIHNlbGYudG9jIGlmIHNlbGYucnVuIGVsc2Ugc2VsZi50b2MKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICBkID0gZGF0ZXRpbWUuZnJvbXRpbWVzdGFtcChzZWxmLmVsYXBzZWQoKSkudGltZSgpCiAgICAgICAgZiA9IGludChkLm1pY3Jvc2Vjb25kLzFFKzYqMTAwKQogICAgICAgIHJldHVybiAnezowMmR9Ons6MDJkfTp7OjAyZH0uezowMmR9Jy5mb3JtYXQoZC5ob3VyLGQubWludXRlLGQuc2Vjb25kLGYpCgojIC4KCmZyb20gdGltZSBpbXBvcnQgc2xlZXAKCnN3ID0gU3RvcHdhdGNoKCkKcHJpbnQoc3cpICMgPSAwMC4wMApzdy5zdGFydCgpCnByaW50KHN3KSAjIH4gMDAuMDAKc2xlZXAoMC41KQpwcmludChzdykgIyB+IDAwLjUwCgpzdy5zdG9wKCkKc2xlZXAoMC41KQpwcmludChzdykgIyB+IDAwLjUwCnN3LnN0YXJ0KCkKc2xlZXAoMC41KQpwcmludChzdykgIyB+IDAxLjAwCgpzdy5yZXNldCgpCnByaW50KHN3KSAjID0gMDAuMDAKc3cuc3RhcnQoKQpzbGVlcCgxKQpwcmludChzdykgIyB+IDAxLjAw