https://github.com/python/cpython/commit/2a7a0020c9d006d268b839320979364498a5f0e6
commit: 2a7a0020c9d006d268b839320979364498a5f0e6
branch: main
author: Furkan Onder <[email protected]>
committer: serhiy-storchaka <[email protected]>
date: 2024-02-16T12:03:46Z
summary:
gh-69990: Make Profile.print_stats support sorting by multiple values
(GH-104590)
Co-authored-by: Chiu-Hsiang Hsu
files:
A Misc/NEWS.d/next/Library/2023-05-17-21-33-21.gh-issue-69990.Blvz9G.rst
M Doc/library/profile.rst
M Lib/cProfile.py
M Lib/profile.py
M Lib/test/test_profile.py
diff --git a/Doc/library/profile.rst b/Doc/library/profile.rst
index cc059b66fcb84b..3ca802e024bc27 100644
--- a/Doc/library/profile.rst
+++ b/Doc/library/profile.rst
@@ -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*.
diff --git a/Lib/cProfile.py b/Lib/cProfile.py
index 135a12c3965c00..9c132372dc4ee0 100755
--- a/Lib/cProfile.py
+++ b/Lib/cProfile.py
@@ -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
diff --git a/Lib/profile.py b/Lib/profile.py
index 4b82523b03d64b..f2f8c2f21333e0 100755
--- a/Lib/profile.py
+++ b/Lib/profile.py
@@ -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:
diff --git a/Lib/test/test_profile.py b/Lib/test/test_profile.py
index a1dfc9abbb8ef7..0f16b92334999c 100644
--- a/Lib/test/test_profile.py
+++ b/Lib/test/test_profile.py
@@ -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())
diff --git
a/Misc/NEWS.d/next/Library/2023-05-17-21-33-21.gh-issue-69990.Blvz9G.rst
b/Misc/NEWS.d/next/Library/2023-05-17-21-33-21.gh-issue-69990.Blvz9G.rst
new file mode 100644
index 00000000000000..b0cdf44f7b9e39
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2023-05-17-21-33-21.gh-issue-69990.Blvz9G.rst
@@ -0,0 +1 @@
+:meth:`Profile.print_stats` has been improved to accept multiple sort
arguments. Patched by Chiu-Hsiang Hsu and Furkan Onder.
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]