Closed
Description
Feature or enhancement
Similar to gh-92216 (for type objects) - attribute lookup on module objects for non-existing attributes is significantly slower compared to existing attributes, as well as non-existing attributes on types and instances.
microbenchmark on main:
python -m pyperf timeit -s 'import os' 'hasattr(os, "getenv")'
.....................
Mean +- std dev: 37.8 ns +- 1.5 ns
python -m pyperf timeit -s 'import os' 'hasattr(os, "nothing")'
.....................
Mean +- std dev: 541 ns +- 16 ns
As in gh-92216, the reason for the slowness is time spent in creating an AttributeError
, which is not needed.
By adding a special case for modules (similar to the type special case in gh-99979), this overhead can be eliminated.