Poor collection performance due to expensive iscoroutinefunction
check
#720
Labels
Milestone
iscoroutinefunction
check
#720
Hello
pytest-asyncio
developers! We've been using your plugin for a while. So much so that we now have tens of thousands of tests and hundreds of thousands of fixture arguments and ... it takes over three minutes to collect our tests.Of that time, roughly two and a half minutes is taken up by
pytest-asyncio
. Specifically, this piece of code:pytest-asyncio/pytest_asyncio/plugin.py
Line 213 in edb9ae0
That ends up calling https://github.com/python/cpython/blob/3aea6c4823e90172c9bc36cd20dc51b295d8a3c4/Lib/inspect.py#L384, which unwraps each fixture argument, makes sure it's a function, and then finally checks its
co_flags
to see if it's been marked as a coroutine function. The thing is, because you're feeding fixtures through, they tend to all be functions.We ended up forking the plugin and inlining
iscoroutinefunction
andisasyncgenfunction
- just the bit masking lines. Then we removed the code that was attaching thescoped_event_loop
fixture because we don't use it and it was compounding the issue described above. That took us down to one minute.I think it would help a lot to make the same changes here upstream. You could also swap the ordering of the comparison with
pytest-asyncio/pytest_asyncio/plugin.py
Line 217 in edb9ae0
scoped_event_loop
optional would bring your plugin even closer to baseline performance.The text was updated successfully, but these errors were encountered: