GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing github.com — [Enhancement] Speed up setting and deleting mutable attributes on non-dataclass subclasses of frozen dataclasses · Issue #102578 · python/cpython Closed Labels 3.12only security fixesonly security fixesperformancePerformance or resource usagePerformance or resource usagestdlibStandard Library Python modules in the Lib/ directoryStandard Library Python modules in the Lib/ directorytype-featureA feature request or enhancementA feature request or enhancement DescriptionFeature or enhancementThe Creating This issue proposes to change the In [1]: # tuple-based In [2]: %timeit 'a' in ('a', 'b', 'c', 'd', 'e', 'f', 'g') 9.91 ns ± 0.0982 ns per loop (mean ± std. dev. of 7 runs, 100,000,000 loops each) In [3]: %timeit 'd' in ('a', 'b', 'c', 'd', 'e', 'f', 'g') 33.2 ns ± 0.701 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each) In [4]: %timeit 'g' in ('a', 'b', 'c', 'd', 'e', 'f', 'g') 56.4 ns ± 0.818 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each) In [5]: # set-based In [6]: %timeit 'a' in {'a', 'b', 'c', 'd', 'e', 'f', 'g'} 11.3 ns ± 0.0723 ns per loop (mean ± std. dev. of 7 runs, 100,000,000 loops each) In [7]: %timeit 'd' in {'a', 'b', 'c', 'd', 'e', 'f', 'g'} 11 ns ± 0.106 ns per loop (mean ± std. dev. of 7 runs, 100,000,000 loops each) In [8]: %timeit 'g' in {'a', 'b', 'c', 'd', 'e', 'f', 'g'} 11.1 ns ± 0.126 ns per loop (mean ± std. dev. of 7 runs, 100,000,000 loops each) A tiny benchmark script: from contextlib import suppress from dataclasses import FrozenInstanceError, dataclass @dataclass(frozen=True) class Foo2: a: int b: int foo2 = Foo2(1, 2) def bench2(inst): with suppress(FrozenInstanceError): inst.a = 0 with suppress(FrozenInstanceError): inst.b = 0 @dataclass(frozen=True) class Foo7: a: int b: int c: int d: int e: int f: int g: int foo7 = Foo7(1, 2, 3, 4, 5, 6, 7) def bench7(inst): with suppress(FrozenInstanceError): inst.a = 0 with suppress(FrozenInstanceError): inst.b = 0 with suppress(FrozenInstanceError): inst.c = 0 with suppress(FrozenInstanceError): inst.d = 0 with suppress(FrozenInstanceError): inst.e = 0 with suppress(FrozenInstanceError): inst.f = 0 with suppress(FrozenInstanceError): inst.g = 0 class Bar(Foo7): def __init__(self, a, b, c, d, e, f, g): super().__init__(a, b, c, d, e, f, g) self.baz = 0 def bench(inst): inst.baz = 1 Result:
In [2]: %timeit bench2(foo2) 1.08 µs ± 28.1 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each) In [3]: %timeit bench7(foo7) 3.81 µs ± 20.3 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each) In [4]: %timeit bench(bar) 249 ns ± 6.31 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
In [2]: %timeit bench2(foo2) 1.15 µs ± 10.9 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each) In [3]: %timeit bench7(foo7) 3.97 µs ± 15.7 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each) In [4]: %timeit bench(bar) 269 ns ± 4.09 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
In [2]: %timeit bench2(foo2) 1.15 µs ± 10.9 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each) In [3]: %timeit bench7(foo7) 3.97 µs ± 15.7 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each) The Ref: #102573 Pitch(Explain why this feature or enhancement should be implemented and how it would be used. In the autogenerate def __setattr__(self, name, value): if type(self) is {{UserType}} or name in ({{a tuple of field names}}): raise FrozenInstanceError(f"cannot assign to field {name!r}") super(cls, self).__setattr__(name, value) If someone inherits the frozen dataclass, the sanity check will take @dataclass(frozen=True) class FrozenBase: x: int y: int ... # N_FIELDS class Foo(FrozenBase): def __init__(self, x, y, somevalue, someothervalue): super().__init__(x, y) self.somevalue = somevalue # takes O(N_FIELDS) self.someothervalue = someothervalue # takes O(N_FIELDS) time again foo = Foo(1, 2, 3, 4) foo.extravalue = extravalue # takes O(N_FIELDS) time again Previous discussionN/A. Linked PRsActivity
MetadataMetadataAssigneesLabels3.12only security fixesonly security fixesperformancePerformance or resource usagePerformance or resource usagestdlibStandard Library Python modules in the Lib/ directoryStandard Library Python modules in the Lib/ directorytype-featureA feature request or enhancementA feature request or enhancement ProjectsMilestoneRelationshipsDevelopmentIssue actions |
| You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |