#35246: Make Field.unique a plain attribute -------------------------------------+------------------------------------- Reporter: Adam Johnson | Owner: Adam Type: | Johnson Cleanup/optimization | Status: assigned Component: Database layer | Version: dev (models, ORM) | Severity: Normal | Resolution: Keywords: | Triage Stage: | Unreviewed Has patch: 1 | Needs documentation: 0 Needs tests: 0 | Patch needs improvement: 0 Easy pickings: 0 | UI/UX: 0 -------------------------------------+------------------------------------- Changes (by Adam Johnson):
* has_patch: 0 => 1 Old 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. New 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 it still seems worth the minimal change.) `unique` is accessed in many other code paths so this change will help those paths too. -- -- Ticket URL: <https://code.djangoproject.com/ticket/35246#comment:1> Django <https://code.djangoproject.com/> The Web framework for perfectionists with deadlines. -- You received this message because you are subscribed to the Google Groups "Django updates" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-updates+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/0107018dd5dbed27-da5a4bc9-3178-4c20-b3a6-5032b5b3af6b-000000%40eu-central-1.amazonses.com.