Spaces:
Sleeping
Sleeping
import atexit | |
import pstats | |
import io | |
import cProfile | |
import os | |
def register_profiler(write_profile, pr, folder_path): | |
atexit.register(write_profile, pr, folder_path) | |
class Profiler: | |
""" | |
Overview: | |
A class for profiling code execution. It can be used as a context manager or a decorator. | |
Interfaces: | |
``__init__``, ``mkdir``, ``write_profile``, ``profile``. | |
""" | |
def __init__(self): | |
""" | |
Overview: | |
Initialize the Profiler object. | |
""" | |
self.pr = cProfile.Profile() | |
def mkdir(self, directory: str): | |
""" | |
OverView: | |
Create a directory if it doesn't exist. | |
Arguments: | |
- directory (:obj:`str`): The path of the directory to be created. | |
""" | |
if not os.path.exists(directory): | |
os.makedirs(directory) | |
def write_profile(self, pr: cProfile.Profile, folder_path: str): | |
""" | |
OverView: | |
Write the profiling results to files. | |
Arguments: | |
- pr (:obj:`cProfile.Profile`): The profiler object containing the profiling results. | |
- folder_path (:obj:`str`): The path of the folder where the profiling files will be saved. | |
""" | |
pr.disable() | |
s_tottime = io.StringIO() | |
s_cumtime = io.StringIO() | |
ps = pstats.Stats(pr, stream=s_tottime).sort_stats('tottime') | |
ps.print_stats() | |
with open(folder_path + "/profile_tottime.txt", 'w+') as f: | |
f.write(s_tottime.getvalue()) | |
ps = pstats.Stats(pr, stream=s_cumtime).sort_stats('cumtime') | |
ps.print_stats() | |
with open(folder_path + "/profile_cumtime.txt", 'w+') as f: | |
f.write(s_cumtime.getvalue()) | |
pr.dump_stats(folder_path + "/profile.prof") | |
def profile(self, folder_path="./tmp"): | |
""" | |
OverView: | |
Enable profiling and save the results to files. | |
Arguments: | |
- folder_path (:obj:`str`): The path of the folder where the profiling files will be saved. \ | |
Defaults to "./tmp". | |
""" | |
self.mkdir(folder_path) | |
self.pr.enable() | |
register_profiler(self.write_profile, self.pr, folder_path) | |