| |
| """ |
| Utilities for timing code execution. |
| """ |
|
|
| |
| |
| |
| |
| |
| |
|
|
| |
| |
| |
|
|
| import time |
|
|
| |
| |
| |
|
|
| |
| try: |
| import resource |
| except ModuleNotFoundError: |
| resource = None |
|
|
| |
| if resource is not None and hasattr(resource, "getrusage"): |
| def clocku(): |
| """clocku() -> floating point number |
| |
| Return the *USER* CPU time in seconds since the start of the process. |
| This is done via a call to resource.getrusage, so it avoids the |
| wraparound problems in time.clock().""" |
|
|
| return resource.getrusage(resource.RUSAGE_SELF)[0] |
|
|
| def clocks(): |
| """clocks() -> floating point number |
| |
| Return the *SYSTEM* CPU time in seconds since the start of the process. |
| This is done via a call to resource.getrusage, so it avoids the |
| wraparound problems in time.clock().""" |
|
|
| return resource.getrusage(resource.RUSAGE_SELF)[1] |
|
|
| def clock(): |
| """clock() -> floating point number |
| |
| Return the *TOTAL USER+SYSTEM* CPU time in seconds since the start of |
| the process. This is done via a call to resource.getrusage, so it |
| avoids the wraparound problems in time.clock().""" |
|
|
| u,s = resource.getrusage(resource.RUSAGE_SELF)[:2] |
| return u+s |
|
|
| def clock2(): |
| """clock2() -> (t_user,t_system) |
| |
| Similar to clock(), but return a tuple of user/system times.""" |
| return resource.getrusage(resource.RUSAGE_SELF)[:2] |
|
|
| else: |
| |
| |
| clocku = clocks = clock = time.process_time |
|
|
| def clock2(): |
| """Under windows, system CPU time can't be measured. |
| |
| This just returns process_time() and zero.""" |
| return time.process_time(), 0.0 |
|
|
| |
| def timings_out(reps,func,*args,**kw): |
| """timings_out(reps,func,*args,**kw) -> (t_total,t_per_call,output) |
| |
| Execute a function reps times, return a tuple with the elapsed total |
| CPU time in seconds, the time per call and the function's output. |
| |
| Under Unix, the return value is the sum of user+system time consumed by |
| the process, computed via the resource module. This prevents problems |
| related to the wraparound effect which the time.clock() function has. |
| |
| Under Windows the return value is in wall clock seconds. See the |
| documentation for the time module for more details.""" |
|
|
| reps = int(reps) |
| assert reps >=1, 'reps must be >= 1' |
| if reps==1: |
| start = clock() |
| out = func(*args,**kw) |
| tot_time = clock()-start |
| else: |
| rng = range(reps-1) |
| start = clock() |
| for dummy in rng: func(*args,**kw) |
| out = func(*args,**kw) |
| tot_time = clock()-start |
| av_time = tot_time / reps |
| return tot_time,av_time,out |
|
|
|
|
| def timings(reps,func,*args,**kw): |
| """timings(reps,func,*args,**kw) -> (t_total,t_per_call) |
| |
| Execute a function reps times, return a tuple with the elapsed total CPU |
| time in seconds and the time per call. These are just the first two values |
| in timings_out().""" |
|
|
| return timings_out(reps,func,*args,**kw)[0:2] |
|
|
|
|
| def timing(func,*args,**kw): |
| """timing(func,*args,**kw) -> t_total |
| |
| Execute a function once, return the elapsed total CPU time in |
| seconds. This is just the first value in timings_out().""" |
|
|
| return timings_out(1,func,*args,**kw)[0] |
|
|
|
|