Source code for pyworkflow.utils.profiler


import time
instances = {}
elapsedTime = {}


[docs]def getInstancesCount(): return instances
[docs]def instanceCreated(cls): instances[cls] = instances.get(cls, 0) + 1
[docs]def instanceDestroyed(cls): instances[cls] = instances.get(cls, 0) - 1
[docs]def printInstances(): for k, v in instances.items(): print("%s: %d", k, v)
[docs]def waitForDebugger(seconds=20): print("Waiting for debugger %d seconds." % seconds) from pyworkflow.utils import printTraceBack printTraceBack() while seconds > 0: time.sleep(1) # Set seconds to 0: # Execute this in the debugger: seconds = 0 print(str(seconds) + " seconds left.") seconds -= 1
# From: https://www.huyng.com/posts/python-performance-analysis
[docs]class Timer(object): indentation = 0 blackList = [] whiteList = [] minms = 1 def __init__(self, name=None, verbose=True): self.verbose = verbose self.name = name Timer.indentation += 1 def __enter__(self): self.start = time.time() return self def __exit__(self, *args): self.end = time.time() self.secs = self.end - self.start self.msecs = self.secs * 1000 # millisecs Timer.indentation -= 1 toPrint = (len(Timer.whiteList) == 0) if any(self.name.startswith(s) for s in Timer.blackList): toPrint = False if any(self.name.startswith(s) for s in Timer.whiteList): toPrint = True if self.verbose and toPrint and self.msecs > Timer.minms: print('{0}{1:10.0f}\tms\t{2}'.format('\t' * Timer.indentation, self.msecs, self.name))
# To monitor memory leaks: # 1.- Check you have installed pympler: scipion run pip install pympler # 2.- Uncomment lines below # 3.- Add a with statement like: # with monitor.MemoryMonitor(): # <code to analyze> # from pympler.tracker import SummaryTracker # # # class MemoryMonitor(object): # # def __init__(self): # self.tracker = None # # def __enter__(self): # self.tracker = SummaryTracker() # self.tracker.print_diff() # return self # # def __exit__(self, *args): # self.tracker.print_diff()