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))