|
|
|
""" |
|
Utilities for timing code execution. |
|
""" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import time |
|
|
|
|
|
|
|
|
|
|
|
|
|
try: |
|
import resource |
|
except ImportError: |
|
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] |
|
|
|
|