22 """Utilities for measuring execution time. 24 __all__ = [
"logInfo",
"timeMethod"]
35 """Log ``(name, value)`` pairs to ``obj.metadata`` and ``obj.log`` 39 obj : `lsst.pipe.base.Task`-type 40 A `~lsst.pipe.base.Task` or any other object with these two attributes: 42 - ``metadata`` an instance of `lsst.daf.base.PropertyList`` (or other object with 43 ``add(name, value)`` method). 44 - ``log`` an instance of `lsst.log.Log`. 47 A sequence of ``(name, value)`` pairs, with value typically numeric. 49 Log level (an `lsst.log` level constant, such as `lsst.log.Log.DEBUG`). 52 for name, value
in pairs:
55 obj.metadata.addLongLong(name, value)
56 except TypeError
as e:
57 obj.metadata.add(name, value)
58 strList.append(
"%s=%s" % (name, value))
59 log(obj.log.getName(), logLevel,
"; ".join(strList))
62 def logInfo(obj, prefix, logLevel=Log.DEBUG):
63 """Log timer information to ``obj.metadata`` and ``obj.log``. 67 obj : `lsst.pipe.base.Task`-type 68 A `~lsst.pipe.base.Task` or any other object with these two attributes: 70 - ``metadata`` an instance of `lsst.daf.base.PropertyList`` (or other object with 71 ``add(name, value)`` method). 72 - ``log`` an instance of `lsst.log.Log`. 75 Name prefix, the resulting entries are ``CpuTime``, etc.. For example timeMethod uses 76 ``prefix = Start`` when the method begins and ``prefix = End`` when the method ends. 78 Log level (an `lsst.log` level constant, such as `lsst.log.Log.DEBUG`). 84 - ``Utc``: UTC date in ISO format (only in metadata since log entries have timestamps). 85 - ``CpuTime``: CPU time (seconds). 86 - ``MaxRss``: maximum resident set size. 88 All logged resource information is only for the current process; child processes are excluded. 90 cpuTime = time.clock()
91 utcStr = datetime.datetime.utcnow().isoformat()
92 res = resource.getrusage(resource.RUSAGE_SELF)
93 obj.metadata.add(name=prefix +
"Utc", value=utcStr)
96 (prefix +
"CpuTime", cpuTime),
97 (prefix +
"UserTime", res.ru_utime),
98 (prefix +
"SystemTime", res.ru_stime),
99 (prefix +
"MaxResidentSetSize", int(res.ru_maxrss)),
100 (prefix +
"MinorPageFaults", int(res.ru_minflt)),
101 (prefix +
"MajorPageFaults", int(res.ru_majflt)),
102 (prefix +
"BlockInputs", int(res.ru_inblock)),
103 (prefix +
"BlockOutputs", int(res.ru_oublock)),
104 (prefix +
"VoluntaryContextSwitches", int(res.ru_nvcsw)),
105 (prefix +
"InvoluntaryContextSwitches", int(res.ru_nivcsw)),
112 """Decorator to measure duration of a task method. 121 Writes various measures of time and possibly memory usage to the task's metadata; all items are prefixed 122 with the function name. 126 This decorator only works with instance methods of Task, or any class with these attributes: 128 - ``metadata``: an instance of `lsst.daf.base.PropertyList` (or other object with 129 ``add(name, value)`` method). 130 - ``log``: an instance of `lsst.log.Log`. 136 import lsst.pipe.base as pipeBase 137 class FooTask(pipeBase.Task): 141 def run(self, ...): # or any other instance method you want to time 145 @functools.wraps(func)
146 def wrapper(self, *args, **keyArgs):
147 logInfo(obj=self, prefix=func.__name__ +
"Start")
149 res = func(self, *args, **keyArgs)
151 logInfo(obj=self, prefix=func.__name__ +
"End")
def logInfo(obj, prefix, logLevel=Log.DEBUG)
def logPairs(obj, pairs, logLevel=Log.DEBUG)