Skip to content

gh-103193: Speedup and inline inspect._is_type - #103321

Merged
AlexWaygood merged 1 commit into
python:mainfrom
AlexWaygood:speedup-inspect-istype
Apr 6, 2023
Merged

gh-103193: Speedup and inline inspect._is_type#103321
AlexWaygood merged 1 commit into
python:mainfrom
AlexWaygood:speedup-inspect-istype

Conversation

@AlexWaygood

@AlexWaygoodAlexWaygood commented Apr 6, 2023

Copy link
Copy Markdown
Member

(Using @sobolevn's benchmark script from #103193 (comment).)

Benchmarks on main:

type[Foo] : 74 ± 0 ns
Foo : 177 ± 1 ns
type[Bar] : 74 ± 0 ns
Bar : 177 ± 0 ns
WithParentClassX : 229 ± 0 ns
Baz : 216 ± 0 ns
WithParentX : 266 ± 1 ns
type[Missing] : 210 ± 0 ns
Missing : 219 ± 1 ns
Slotted : 214 ± 0 ns
Method : 178 ± 0 ns
StMethod : 178 ± 0 ns
ClsMethod : 178 ± 1 ns

Benchmarks with this PR:

type[Foo] : 74 ± 0 ns
Foo : 134 ± 0 ns
type[Bar] : 74 ± 0 ns
Bar : 133 ± 0 ns
WithParentClassX : 187 ± 0 ns
Baz : 171 ± 0 ns
WithParentX : 220 ± 0 ns
type[Missing] : 210 ± 1 ns
Missing : 174 ± 0 ns
Slotted : 169 ± 0 ns
Method : 133 ± 0 ns
StMethod : 133 ± 0 ns
ClsMethod : 133 ± 0 ns

This speeds up this isinstance() call 1.25x relative to main:

fromtypingimport*@runtime_checkableclassFoo(Protocol):
a: intb: intc: intd: inte: intf: intg: inth: inti: intj: intclassBar:
def__init__(self):
forattrnamein'abcdefghij':
setattr(self, attrname, 42)
isinstance(Bar(), Foo)

@AlexWaygoodAlexWaygood added type-feature A feature request or enhancement performance Performance or resource usage stdlib Standard Library Python modules in the Lib/ directory 3.12 only security fixes labels Apr 6, 2023

@carljmcarljm left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The improvements keep on coming!

Comment threadLib/inspect.py
Comment on lines +1818 to +1820
objtype = type(obj)
if type not in _static_getmro(objtype):
klass = objtype

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This has equivalent semantics with less code and fewer assignments, but perhaps it muddies the semantics of the klass var a bit (since it will temporarily be "wrong" in the case that obj is already a type.) No strong feelings, whatever you prefer.

Suggested change
objtype=type(obj)
iftypenotin_static_getmro(objtype):
klass=objtype
klass=type(obj)
iftypenotin_static_getmro(klass):

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm. Yeah, I see what you mean, but I think I'd prefer to keep the semantics of klass clear here :)

@AlexWaygood
AlexWaygood merged commit dca7d17 into python:mainApr 6, 2023
@AlexWaygood
AlexWaygood deleted the speedup-inspect-istype branch April 6, 2023 20:50
@AlexWaygood

Copy link
Copy Markdown
MemberAuthor

The improvements keep on coming!

Optimisations will continue until morale improves!

warsaw pushed a commit to warsaw/cpython that referenced this pull request Apr 11, 2023
Improve performance of `inspect.getattr_static`
@namka279

This comment was marked as spam.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

3.12only security fixesperformancePerformance or resource usageskip newsstdlibStandard Library Python modules in the Lib/ directorytype-featureA feature request or enhancement

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@AlexWaygood@namka279@carljm@bedevere-bot