Opened 9 months ago

Last modified 9 months ago

#35246 closed Cleanup/optimization

Make Field.unique a plain attribute — at Version 2

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 (last modified by Adam Johnson)

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 it still seems worth the minimal change.)

unique is accessed in many other code paths so this change will help those paths too.

Change History (2)

comment:1 by Adam Johnson, 9 months ago

Description: modified (diff)
Has patch: set

comment:2 by Adam Johnson, 9 months ago

Description: modified (diff)
Note: See TracTickets for help on using tickets.
Back to Top