python-peps/pep-0418/clock_precision.py

75 lines
2.0 KiB
Python

import time
try:
from time import timeout_time
except ImportError:
from time import time as timeout_time
def compute_precision(func):
precision = None
points = 0
timeout = timeout_time() + 1.0
previous = func()
while timeout_time() < timeout or points < 3:
for loop in range(10):
t1 = func()
t2 = func()
dt = t2 - t1
if 0 < dt:
break
else:
dt = t2 - previous
if dt <= 0.0:
continue
if precision is not None:
precision = min(precision, dt)
else:
precision = dt
points += 1
previous = func()
return precision
def format_duration(dt):
if dt >= 1e-3:
return "%.0f ms" % (dt * 1e3)
if dt >= 1e-6:
return "%.0f us" % (dt * 1e6)
else:
return "%.0f ns" % (dt * 1e9)
def test_clock(name, func):
print("%s:" % name)
precision = compute_precision(func)
print("- precision in Python: %s" % format_duration(precision))
clocks = ['clock', 'perf_counter', 'process_time']
if hasattr(time, 'monotonic'):
clocks.append('monotonic')
clocks.append('time')
for name in clocks:
func = getattr(time, name)
test_clock("%s()" % name, func)
info = time.get_clock_info(name)
if 'precision' in info:
print("- announced precision: %s" % format_duration(info['precision']))
print("- implementation: %s" % info['implementation'])
print("- resolution: %s" % format_duration(info['resolution']))
clock_ids = [name for name in dir(time) if name.startswith("CLOCK_")]
clock_ids.sort()
for clock_id_text in clock_ids:
clock_id = getattr(time, clock_id_text)
name = 'clock_gettime(%s)' % clock_id_text
def gettime():
return time.clock_gettime(clock_id)
try:
gettime()
except OSError as err:
print("%s failed: %s" % (name, err))
continue
test_clock(name, gettime)
precision = time.clock_getres(clock_id)
print("- announced precision: %s" % format_duration(precision))