Skip to content

Conversation

@AlexWaygood
Copy link
Member

@AlexWaygoodAlexWaygood commented Apr 6, 2023

(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
Copy link
Member

@carljmcarljm left a comment

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 on lines +1818 to +1820
objtype=type(obj)
iftypenotin_static_getmro(objtype):
klass=objtype
Copy link
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
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 :)

@AlexWaygoodAlexWaygood merged commit dca7d17 into python:mainApr 6, 2023
@AlexWaygoodAlexWaygood deleted the speedup-inspect-istype branch April 6, 2023 20:50
@AlexWaygood
Copy link
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