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.