"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 => **