optimize getting of line number in pytest discovery#26017
Open
vaclavHala wants to merge 1 commit into
Open
Conversation
…xpensive call before falling back to location query
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The discovery for pytest is still quite a bit slower than running plain
-m pytest --collect-onlyso I investigated a bit more and the next most significant (at least for our test suite) slowdown is caused by thepytest.Item.locationcall used to get line number of the test:This is because the
.locationreturns tuple of path and line number, of which only the line number is used by the discovery, but computing the path is rather expensive. This PR proposes an optimization which uses internal pytest API in exactly the same way as thelocationfunction itself, but without also computing the path.In particular, the
locationcall hierarchy is:This PR calls
Code.from_functiondirectly and only gets.firstlinenofrom it.Both profiles are captured with this PR cherry-picked to main branch prior to the discovery result compaction introduced in 5389068 which causes significant performance hit that overshadows the optimization done here, for that I created a separate PR #26016 with proposed fix.
This change makes the discovery about 20% faster for our suite, now almost on par with the raw
pytestcall