Before:
$ python3.14 -m timeit -s 'import sysconfig' 'sysconfig.get_paths()'
2000 loops, best of 5: 157 usec per loop
$ python3.14 -m timeit -s 'import sysconfig' 'sysconfig.get_paths()'
2000 loops, best of 5: 162 usec per loop
$ python3.14 -m timeit -s 'import sysconfig' 'sysconfig.get_paths()'
1000 loops, best of 5: 146 usec per loop
After:
$ python3.14 -m timeit -s 'import sysconfig' 'sysconfig.get_paths()'
5000 loops, best of 5: 75.9 usec per loop
$ python3.14 -m timeit -s 'import sysconfig' 'sysconfig.get_paths()'
5000 loops, best of 5: 77.1 usec per loop
$ python3.14 -m timeit -s 'import sysconfig' 'sysconfig.get_paths()'
5000 loops, best of 5: 76.2 usec per loop
The results are inconclusive on 3.12,
but we want the patch to be identical (if possible).
This can be shipped with the next update.
The code in CPython uses XML_SetReparseDeferralEnabled when expat is >= 2.6 during the build.
However, when users upgrade Python independently on the expat package,
they may have expat 2.5 installed and see errors like:
$ python3.1X -m venv venv
Error: Command '['venv/bin/python3.1X', '-m', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 1.
$ venv/bin/python3.1X -m ensurepip --upgrade --default-pip
Traceback (most recent call last):
...
File "/tmp/.../pip-24.0-py3-none-any.whl/pip/_internal/commands/install.py", line 15, in <module>
from pip._internal.cli.req_command import (
...<3 lines>...
)
File "/tmp/.../pip-24.0-py3-none-any.whl/pip/_internal/cli/req_command.py", line 21, in <module>
from pip._internal.index.package_finder import PackageFinder
File "/tmp/.../pip-24.0-py3-none-any.whl/pip/_internal/index/package_finder.py", line 30, in <module>
from pip._internal.req import InstallRequirement
File "/tmp/.../pip-24.0-py3-none-any.whl/pip/_internal/req/__init__.py", line 8, in <module>
from .req_install import InstallRequirement
File "/tmp/.../pip-24.0-py3-none-any.whl/pip/_internal/req/req_install.py", line 40, in <module>
from pip._internal.operations.install.wheel import install_wheel
File "/tmp/.../pip-24.0-py3-none-any.whl/pip/_internal/operations/install/wheel.py", line 39, in <module>
from pip._vendor.distlib.scripts import ScriptMaker
File "/tmp/.../pip-24.0-py3-none-any.whl/pip/_vendor/distlib/scripts.py", line 16, in <module>
from .compat import sysconfig, detect_encoding, ZipFile
File "/tmp/.../pip-24.0-py3-none-any.whl/pip/_vendor/distlib/compat.py", line 81, in <module>
import xmlrpc.client as xmlrpclib
File "/usr/lib64/python3.1X/xmlrpc/client.py", line 138, in <module>
from xml.parsers import expat
File "/usr/lib64/python3.1X/xml/parsers/expat.py", line 4, in <module>
from pyexpat import *
ImportError: /usr/lib64/python3.1X/lib-dynload/pyexpat.cpython-31X-x86_64-linux-gnu.so: undefined symbol: XML_SetReparseDeferralEnabled
Traceback (most recent call last):
...
subprocess.CalledProcessError: Command '['venv/bin/python3.1X', '-W', 'ignore::DeprecationWarning', '-c', '\nimport runpy\nimport sys\nsys.path = [\'/tmp/.../pip-24.0-py3-none-any.whl\'] + sys.path\nsys.argv[1:] = [\'install\', \'--no-cache-dir\', \'--no-index\', \'--find-links\', \'/tmp/...\', \'--upgrade\', \'pip\']\nrunpy.run_module("pip", run_name="__main__", alter_sys=True)\n']' returned non-zero exit status 1.
Thanks to Markus Falb for discovering this problem.
https://lists.fedoraproject.org/archives/list/python-devel@lists.fedoraproject.org/thread/7XHGWHBQDNFKNGSZTP44SSD6PQKZPG6C/