edq.cli.profile.cprofile
Profile some Python target using Python's cprofile stdlib.
1""" 2Profile some Python target using Python's cprofile stdlib. 3""" 4 5import argparse 6import sys 7 8import edq.core.argparser 9import edq.util.profile 10 11DEFAULT_ROW_COUNT: int = 50 12 13def run_cli(args: argparse.Namespace) -> int: 14 """ Run the CLI. """ 15 16 stats = edq.util.profile.cprofile(args.run_target, imports = args.imports, is_module = args.module, module_args = args.module_args) 17 18 print(f"--- BEGIN: All Functions, Sorted by Cumulative Time, Top {args.row_count} ---") 19 stats.sort_stats('cumtime').print_stats(args.row_count) 20 print(f"--- END: All Functions, Sorted by Cumulative Time, Top {args.row_count} ---") 21 22 print(f"--- BEGIN: All Functions, Sorted by Total Time, Top {args.row_count} ---") 23 stats.sort_stats('tottime').print_stats(args.row_count) 24 print(f"--- END: All Functions, Sorted by Total Time, Top {args.row_count} ---") 25 26 for (i, pattern) in enumerate(args.patterns): 27 label = f"Pattern {i}: '{pattern}'" 28 29 print(f"--- BEGIN: {label}, Sorted by Cumulative Time, Top {args.row_count} ---") 30 stats.sort_stats('cumtime').print_stats(pattern, args.row_count) 31 print(f"--- END: {label}, Sorted by Cumulative Time, Top {args.row_count} ---") 32 33 print(f"--- BEGIN: {label}, Sorted by Total Time, Top {args.row_count} ---") 34 stats.sort_stats('tottime').print_stats(pattern, args.row_count) 35 print(f"--- END: {label}, Sorted by Total Time, Top {args.row_count} ---") 36 37 return 0 38 39def main() -> int: 40 """ Get a parser, parse the args, and call run. """ 41 return run_cli(_get_parser().parse_args()) 42 43def _get_parser() -> argparse.ArgumentParser: 44 """ Get the parser. """ 45 46 parser = edq.core.argparser.get_default_parser(__doc__.strip()) 47 48 parser.add_argument('run_target', metavar = 'RUN_TARGET', 49 action = 'store', type = str, 50 help = 'The code to profile.') 51 52 parser.add_argument('module_args', metavar = 'MODULE_ARGS', 53 action = 'store', type = str, nargs = '*', 54 help = 'Additional args to pass to the target if `--module` is used.') 55 56 parser.add_argument('--module', '-m', dest = 'module', 57 action = 'store_true', default = False, 58 help = 'Treat the provided run target as a module, and all other positional arguments are arguments to the module (default: %(default)s).') 59 60 parser.add_argument('--count', dest = 'row_count', 61 action = 'store', type = int, default = DEFAULT_ROW_COUNT, 62 help = 'The maximum number of rows to show per result type (default: %(default)s).') 63 64 parser.add_argument('--import', dest = 'imports', 65 action = 'append', default = [], 66 help = 'Import this module before running the command.') 67 68 parser.add_argument('--pattern', dest = 'patterns', 69 action = 'append', default = [], 70 help = 'A function pattern to display output for.') 71 72 return parser 73 74if (__name__ == '__main__'): 75 sys.exit(main())
DEFAULT_ROW_COUNT: int =
50
def
run_cli(args: argparse.Namespace) -> int:
14def run_cli(args: argparse.Namespace) -> int: 15 """ Run the CLI. """ 16 17 stats = edq.util.profile.cprofile(args.run_target, imports = args.imports, is_module = args.module, module_args = args.module_args) 18 19 print(f"--- BEGIN: All Functions, Sorted by Cumulative Time, Top {args.row_count} ---") 20 stats.sort_stats('cumtime').print_stats(args.row_count) 21 print(f"--- END: All Functions, Sorted by Cumulative Time, Top {args.row_count} ---") 22 23 print(f"--- BEGIN: All Functions, Sorted by Total Time, Top {args.row_count} ---") 24 stats.sort_stats('tottime').print_stats(args.row_count) 25 print(f"--- END: All Functions, Sorted by Total Time, Top {args.row_count} ---") 26 27 for (i, pattern) in enumerate(args.patterns): 28 label = f"Pattern {i}: '{pattern}'" 29 30 print(f"--- BEGIN: {label}, Sorted by Cumulative Time, Top {args.row_count} ---") 31 stats.sort_stats('cumtime').print_stats(pattern, args.row_count) 32 print(f"--- END: {label}, Sorted by Cumulative Time, Top {args.row_count} ---") 33 34 print(f"--- BEGIN: {label}, Sorted by Total Time, Top {args.row_count} ---") 35 stats.sort_stats('tottime').print_stats(pattern, args.row_count) 36 print(f"--- END: {label}, Sorted by Total Time, Top {args.row_count} ---") 37 38 return 0
Run the CLI.
def
main() -> int:
40def main() -> int: 41 """ Get a parser, parse the args, and call run. """ 42 return run_cli(_get_parser().parse_args())
Get a parser, parse the args, and call run.