FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

gh-144764: Made dataclasses construct automatic docstrings lazily by adamchainz · Pull Request #144765 · python/cpython · GitHub

/ cpython Public

gh-144764: Made dataclasses construct automatic docstrings lazily - #144765

Closed
adamchainz wants to merge 1 commit into
python:mainfrom
adamchainz:adamchainz/dataclass-lazy-docstring
Closed

gh-144764: Made dataclasses construct automatic docstrings lazily#144765
adamchainz wants to merge 1 commit into
python:mainfrom
adamchainz:adamchainz/dataclass-lazy-docstring

Conversation

adamchainz commented Feb 12, 2026
edited by bedevere-app Bot
Loading

Copy link
Copy Markdown
Contributor

Move the default docstring construction to occur on-access through a descriptor.

Verified with tprof and this script that generates 10k dataclasses:

from dataclasses import dataclass

for i in range(10_000):
    @dataclass
    class Example:
        field1: int
        field2: str
        field3: float

Before:

$ tprof -t dataclasses._process_class example.py
🎯 tprof results:
 function                     calls total  mean ± σ       min … max
 dataclasses._process_class() 10000    5s 485μs ± 120μs 458μs … 6ms

After:

$ PYTHONPATH=Lib/ uvx tprof -t dataclasses._process_class example.py 🎯 tprof results:
 function                     calls total  mean ± σ       min … max
 dataclasses._process_class() 10000    3s 275μs ± 131μs 245μs … 6ms

The mean time spent in _process_class() has dropped from 485μs to 275μs, a ~42% time saving (admittedly skewed due to the small size of the dataclass).

johnslavik commented Feb 12, 2026
edited
Loading

Copy link
Copy Markdown
Member

DocDescriptor isn't meant to be public API. Can we rename it to a private class?

Move the default docstring construction to occur on-access through a descriptor.

Verified with [tprof](https://github.com/adamchainz/tprof) and this script that generates 10k dataclasses:

```py
from dataclasses import dataclass

for i in range(10_000):
    @DataClass
    class Example:
        field1: int
        field2: str
        field3: float
```

**Before:**

```
$ tprof -t dataclasses._process_class example.py
🎯 tprof results:
 function                     calls total  mean ± σ       min … max
 dataclasses._process_class() 10000    5s 485μs ± 120μs 458μs … 6ms
 ```

After:

```
$ PYTHONPATH=Lib/ uvx tprof -t dataclasses._process_class example.py
🎯 tprof results:
 function                     calls total  mean ± σ       min … max
 dataclasses._process_class() 10000    3s 275μs ± 131μs 245μs … 6ms
```

The mean time spent in `_process_class()` has dropped from 485μs to 275μs, a ~42% time saving (admittedly skewed due to the small size of the dataclass).
adamchainz force-pushed the adamchainz/dataclass-lazy-docstring branch from b69f2e5 to e2293d9 Compare February 13, 2026 00:07

Copy link
Copy Markdown
Contributor Author

DocDescriptor isn't meant to be public API. Can we rename it to a private class?

Good point, done!

danielhollas commented Feb 13, 2026
edited
Loading

Copy link
Copy Markdown
Contributor

Hehe, funny, I ended doing do same trick in my recent PR #144387, with the main purpose of being able to lazy import the inspect module. It's great to see it improves dataclass creation as well (I had a hunch but didn't do careful benchmarking).

Copy link
Copy Markdown
Contributor Author

Aha. I guess your PR wins then, with the lazy import a bonus.

github-actions Bot commented May 6, 2026

Copy link
Copy Markdown

This PR is stale because it has been open for 30 days with no activity.

github-actions Bot added the stale Stale PR or inactive for long period of time. label May 6, 2026

hugovk commented May 6, 2026

Copy link
Copy Markdown
Member

#144387 has been merged, let's close this. Thanks anyway :)

hugovk closed this May 6, 2026
adamchainz deleted the adamchainz/dataclass-lazy-docstring branch May 14, 2026 23:13
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

awaiting review stale Stale PR or inactive for long period of time.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants


Back | FazBrowse Home | New Git URL