File: LP6E/Chapter21/timer2.py
"Use keyword-only arguments with defaults for reps, and positional-only for func."
import time
timer = time.perf_counter
def once(func, /, *pargs, **kargs):
start = timer()
result = func(*pargs, **kargs)
elapsed = timer() - start
return (elapsed, result)
def total(func, /, *pargs, _reps=100_000, **kargs):
total = 0
for i in range(_reps):
time, result = once(func, *pargs, **kargs)
total += time
return (total, result)
def bestof(func, /, *pargs, _reps=5, **kargs):
return min(once(func, *pargs, **kargs) for i in range(_reps))
def bestoftotal(func, /, *pargs, _reps1=50, **kargs):
return min(total(func, *pargs, **kargs) for i in range(_reps1)) # _reps => **