Opened 9 months ago
Last modified 9 months ago
#35246 closed Cleanup/optimization
Make Field.unique a plain attribute — at Initial Version
Reported by: | Adam Johnson | Owned by: | Adam Johnson |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | dev |
Severity: | Normal | Keywords: | |
Cc: | Triage Stage: | Accepted | |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
Another candidate for caching, like #35230, #35232 and #35241, following the same system check profiling.
Field.unique
is a simple property that computes whether a field is unique from two inputs:
@property def unique(self): return self._unique or self.primary_key
The result is immutable because the two input attributes shouldn’t change.
I found this method was called 3543 times during system checks, taking ~0.7% (~0.3ms) of the total runtime on a Python 3.12 project with 118 models. After moving it to a plain attribute, this cost is eliminated. (cProfile’s overhead biases the cost of function calls upwards, so the actual saving may be smaller, but probably not too much smaller.)
unique
is accessed in many other code paths so this change will help those paths too.