<div dir="ltr"><div><font face="monospace, monospace">I use cProfile a lot, and would like to suggest three backwards-compatible improvements to the API.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">1: When using cProfile on a specific piece of code I often use the enable() and disable() methods. It occurred to me that this would be an obvious place to use a context manager.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">2: Enhance the `print_stats` method on Profile to accept more options currently available only through the pstats.Stats class. For example, strip_dirs could be a boolean argument, and limit could accept an int. This would reduce the number of cases you'd need to use the more complex API.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">3: I often forget which string keys are available for sorting. It would be nice to add an enum for these so a user could have their linter and IDE check that value pre-runtime. Since it would subclass `str` and `Enum` it would still work with all currently existing code.</font></div><div><div><font face="monospace, monospace"><br></font></div></div><div><font face="monospace, monospace">The current documentation contains the following code:</font></div><div><font face="monospace, monospace"><br></font></div><font face="monospace, monospace">import cProfile, pstats, io</font><div><font face="monospace, monospace">pr = cProfile.Profile()</font></div><div><font face="monospace, monospace">pr.enable()</font></div><div><font face="monospace, monospace"># ... do something ...</font></div><div><font face="monospace, monospace">pr.disable()</font></div><div><font face="monospace, monospace">s = io.StringIO()</font></div><div><font face="monospace, monospace">sortby = 'cumulative'</font></div><div><font face="monospace, monospace">ps = pstats.Stats(pr, stream=s).sort_stats(sortby)</font></div><div><font face="monospace, monospace">ps.print_stats()</font></div><div><font face="monospace, monospace">print(s.getvalue())</font><div dir="auto"></div>
</div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">While the code below doesn't exactly match the functionality above (eg. not using StringIO), I envision the context manager working like this, along with some adjustments on how to get the stats from the profiler:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">import cProfile, pstats</font></div><div><font face="monospace, monospace">with cProfile.Profile() as pr:</font></div><div><font face="monospace, monospace">    # ... do something ...</font></div><div><font face="monospace, monospace">    pr.print_stats(sort=pstats.Sort.cumulative, limit=10, strip_dirs=True)</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">As you can see, the code is shorter and somewhat more self-documenting. The best thing about these suggestions is that as far as I can tell they would be backwards-compatible API additions.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">What do you think? Thank you in advance for your time!</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">/Thane</font></div></div>