42 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			42 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|  | import cProfile | ||
|  | import os | ||
|  | import pstats | ||
|  | 
 | ||
|  | import lnx | ||
|  | from lnx import log, utils | ||
|  | 
 | ||
|  | if lnx.is_reload(__name__): | ||
|  |     log = lnx.reload_module(log) | ||
|  |     utils = lnx.reload_module(utils) | ||
|  | else: | ||
|  |     lnx.enable_reload(__name__) | ||
|  | 
 | ||
|  | 
 | ||
|  | class Profile: | ||
|  |     """Context manager for profiling the enclosed code when the given condition is true.
 | ||
|  |     The output file is stored in the SDK directory and can be opened by tools such as SnakeViz. | ||
|  |     """
 | ||
|  |     def __init__(self, filename_out: str, condition: bool): | ||
|  |         self.filename_out = filename_out | ||
|  |         self.condition = condition | ||
|  |         self.pr = cProfile.Profile() | ||
|  | 
 | ||
|  |     def __enter__(self): | ||
|  |         if self.condition: | ||
|  |             self.pr.enable() | ||
|  |             log.debug("Profiling started") | ||
|  | 
 | ||
|  |         return self | ||
|  | 
 | ||
|  |     def __exit__(self, exc_type, exc_val, exc_tb): | ||
|  |         if self.condition: | ||
|  |             self.pr.disable() | ||
|  |             log.debug("Profiling finished") | ||
|  | 
 | ||
|  |             profile_path = os.path.join(utils.get_sdk_path(), self.filename_out) | ||
|  |             with open(profile_path, 'w', encoding="utf-8") as profile_file: | ||
|  |                 stats = pstats.Stats(self.pr, stream=profile_file) | ||
|  |                 stats.dump_stats(profile_path) | ||
|  | 
 | ||
|  |         return False |