gh-69990: Make Profile.print_stats support sorting by multiple values (GH-104590)

Co-authored-by: Chiu-Hsiang Hsu
This commit is contained in:
Furkan Onder 2024-02-16 15:03:46 +03:00 committed by GitHub
parent 351c103134
commit 2a7a0020c9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 20 additions and 4 deletions

View file

@ -299,6 +299,13 @@ functions:
Create a :class:`~pstats.Stats` object based on the current
profile and print the results to stdout.
The *sort* parameter specifies the sorting order of the displayed
statistics. It accepts a single key or a tuple of keys to enable
multi-level sorting, as in :func:`Stats.sort_stats <pstats.Stats.sort_stats>`.
.. versionadded:: 3.13
:meth:`~Profile.print_stats` now accepts a tuple of keys.
.. method:: dump_stats(filename)
Write the results of the current profile to *filename*.

View file

@ -41,7 +41,9 @@ class Profile(_lsprof.Profiler):
def print_stats(self, sort=-1):
import pstats
pstats.Stats(self).strip_dirs().sort_stats(sort).print_stats()
if not isinstance(sort, tuple):
sort = (sort,)
pstats.Stats(self).strip_dirs().sort_stats(*sort).print_stats()
def dump_stats(self, file):
import marshal

View file

@ -387,8 +387,9 @@ def simulate_cmd_complete(self):
def print_stats(self, sort=-1):
import pstats
pstats.Stats(self).strip_dirs().sort_stats(sort). \
print_stats()
if not isinstance(sort, tuple):
sort = (sort,)
pstats.Stats(self).strip_dirs().sort_stats(*sort).print_stats()
def dump_stats(self, file):
with open(file, 'wb') as f:

View file

@ -7,7 +7,7 @@
from difflib import unified_diff
from io import StringIO
from test.support.os_helper import TESTFN, unlink, temp_dir, change_cwd
from contextlib import contextmanager
from contextlib import contextmanager, redirect_stdout
import profile
from test.profilee import testfunc, timer
@ -92,6 +92,11 @@ def test_run(self):
self.profilermodule.run("int('1')", filename=TESTFN)
self.assertTrue(os.path.exists(TESTFN))
def test_run_with_sort_by_values(self):
with redirect_stdout(StringIO()) as f:
self.profilermodule.run("int('1')", sort=('tottime', 'stdname'))
self.assertIn("Ordered by: internal time, standard name", f.getvalue())
def test_runctx(self):
with silent():
self.profilermodule.runctx("testfunc()", globals(), locals())

View file

@ -0,0 +1 @@
:meth:`Profile.print_stats` has been improved to accept multiple sort arguments. Patched by Chiu-Hsiang Hsu and Furkan Onder.