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 } " )