import time
class Profiler ( ) :
def __init__ ( self , enabled = False ) :
self . enabled = enabled
self . cp = { }
self . cp_ignored = [ ]
self . iter = 0
self . start_time = time . time ( )
self . last_time = self . start_time
self . tot = 0.
def reset ( self , enabled = False ) :
self . enabled = enabled
self . cp = { }
self . cp_ignored = [ ]
self . iter = 0
self . start_time = time . time ( )
self . last_time = self . start_time
def checkpoint ( self , name , ignore = False ) :
# ignore flag needed when benchmarking threads with ratekeeper
if not self . enabled :
return
tt = time . time ( )
if name not in self . cp :
self . cp [ name ] = 0.
if ignore :
self . cp_ignored . append ( name )
self . cp [ name ] + = tt - self . last_time
if not ignore :
self . tot + = tt - self . last_time
self . last_time = tt
def display ( self ) :
if not self . enabled :
return
self . iter + = 1
print ( " ******* Profiling %d ******* " % self . iter )
for n , ms in sorted ( self . cp . items ( ) , key = lambda x : - x [ 1 ] ) :
if n in self . cp_ignored :
print ( " %30s : %9.2f avg: %7.2f percent: %3.0f IGNORED " % ( n , ms * 1000.0 , ms * 1000.0 / self . iter , ms / self . tot * 100 ) )
else :
print ( " %30s : %9.2f avg: %7.2f percent: %3.0f " % ( n , ms * 1000.0 , ms * 1000.0 / self . iter , ms / self . tot * 100 ) )
print ( f " Iter clock: { self . tot / self . iter : 2.6f } TOTAL: { self . tot : 2.2f } " )