[BUG] The `_distutils_hack` pth file causes significant startup slowdown
See original GitHub issuesetuptools version
60.0.0
Python version
ALL
OS
ALL
Additional environment information
No response
Description
Since setuptools 60.0.0 has been released, Python startup has been impacted noticeably:
This is due to the new pth file that setuptools installs for injecting the distutils
hack. The pth imports the _distutils_hack
module and the ramifications of this import has a noticeable impact on startup time as you can see in the benchmark server.
Here is an estimation of the cost using -X importtime
on my machine:
import time: 278 | 278 | types
import time: 112 | 112 | _operator
import time: 419 | 531 | operator
import time: 129 | 129 | itertools
import time: 325 | 325 | keyword
import time: 468 | 468 | reprlib
import time: 258 | 258 | _collections
import time: 978 | 2156 | collections
import time: 78 | 78 | _functools
import time: 835 | 3068 | functools
import time: 1359 | 5235 | enum
import time: 138 | 138 | _sre
import time: 497 | 497 | sre_constants
import time: 528 | 1025 | sre_parse
import time: 512 | 1674 | sre_compile
import time: 109 | 109 | _locale
import time: 886 | 886 | copyreg
import time: 671 | 8574 | re
import time: 471 | 471 | warnings
import time: 330 | 801 | importlib
import time: 906 | 10279 | _distutils_hack
This almost doubles the startup time (from 13501 us to 24093 us) and unfortunately, as almost all Python installations will have the pth file installed by default, all Python installations will double its startup time.
We have been working very hard to reduce startup time with things like frozen modules (https://bugs.python.org/issue45020) and other optimizations and is unfortunate that this gains are being lost due to this.
See: https://bugs.python.org/issue46110 for more information and discussion
Expected behavior
The distutils hack doesn’t impact startup time.
How to Reproduce
Measure the time spent in python -c pass
. You can use python -Ximporttime -c pass
to generate the import time table for convenience and debugging.
Output
Relevant output of python -X importtime -c pass
:
...
import time: 278 | 278 | types
import time: 112 | 112 | _operator
import time: 419 | 531 | operator
import time: 129 | 129 | itertools
import time: 325 | 325 | keyword
import time: 468 | 468 | reprlib
import time: 258 | 258 | _collections
import time: 978 | 2156 | collections
import time: 78 | 78 | _functools
import time: 835 | 3068 | functools
import time: 1359 | 5235 | enum
import time: 138 | 138 | _sre
import time: 497 | 497 | sre_constants
import time: 528 | 1025 | sre_parse
import time: 512 | 1674 | sre_compile
import time: 109 | 109 | _locale
import time: 886 | 886 | copyreg
import time: 671 | 8574 | re
import time: 471 | 471 | warnings
import time: 330 | 801 | importlib
import time: 906 | 10279 | _distutils_hack
...
Code of Conduct
- I agree to follow the PSF Code of Conduct
Issue Analytics
- State:
- Created 2 years ago
- Comments:10 (10 by maintainers)
Top GitHub Comments
You could reduce the impact on startup performance by not using
contextlib
and moving the import ofre
into the function body.setuptools main branch
with my fix
import of site went from 21774 to 8471.