New GitHub issue #118465 from serhiy-storchaka:<br>

<hr>

<pre>
For example, `./python -m pydoc test.test_enum` takes 32 seconds. It is 20 seconds in 3.12, 15 seconds in 3.11 and only 1.6 seconds in 3.10. Well, perhaps `test.test_enum` was grown, but the main culprit is bpo-35113. And further changes like gh-106727 only added to it.

For every class without a docstring `pydoc` tries to find its comments by calling `inspect.getcomments()` which calls `inspect.findsource()` which reads and parses the module source, then traverse it and find classes with the specific qualname. For large modules with many classes it has quadratic complexity.

I tried to optimize the AST traversing code, and get 18 seconds on main. It still has quadratic complexity. Further optimization will require introducing a cache and finding positions of all classes in one pass.

But it all would be much simpler and faster if simply save the value of `co_firstlineno` of the code object executed during class creation in the file dict (as `__firstlineno__` for example).
</pre>

<hr>

<a href="https://github.com/python/cpython/issues/118465">View on GitHub</a>
<p>Labels: performance</p>
<p>Assignee: </p>