#35405: Use @cached_property for FieldCacheMixin cache key
-------------------------------------+-------------------------------------
Reporter: Adam | Owner: Adam Johnson
Johnson |
Type: | Status: assigned
Cleanup/optimization |
Component: Database | Version: dev
layer (models, ORM) |
Severity: Normal | Keywords:
Triage Stage: | Has patch: 1
Unreviewed |
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
-------------------------------------+-------------------------------------
`FieldCacheMixin` is used by related fields to track their cached values.
Its existing design means calling `get_cache_name()` for each operation,
even though that value doesn’t change. Changing `get_cache_name()` into a
cached property can thus save a bunch of small but useless function calls
working with related fields.
I profiled this change by using cProfile on a selection of tests using
related fields:
{{{
$ python -m cProfile -s cumtime -o profile runtests.py --parallel 1
foreign_object *relat*
...
Found 399 test(s).
...
}}}
Before, there were 12,520 function calls:
{{{
$ python -m pstats profile <<< 'sort cumtime
stats 10000' | rg get_cache_name
11193 0.001 0.000 0.001 0.000
/Users/chainz/Documents/Projects/django/django/db/models/fields/related.py:512(get_cache_name)
712 0.000 0.000 0.000 0.000
/Users/chainz/Documents/Projects/django/django/db/models/fields/reverse_related.py:251(get_cache_name)
615 0.000 0.000 0.000 0.000
/Users/chainz/Documents/Projects/django/django/contrib/contenttypes/fields.py:143(get_cache_name)
}}}
After, there are just 227 calls (should be one per related field):
{{{
$ python -m pstats profile <<< 'sort cumtime
stats 10000' | rg cache_name
172 0.000 0.000 0.000 0.000
/Users/chainz/Documents/Projects/django/django/db/models/fields/related.py:512(cache_name)
34 0.000 0.000 0.000 0.000
/Users/chainz/Documents/Projects/django/django/db/models/fields/reverse_related.py:251(cache_name)
21 0.000 0.000 0.000 0.000
/Users/chainz/Documents/Projects/django/django/contrib/contenttypes/fields.py:143(cache_name)
}}}
The time saving is minimal here. It may be notable when working with a lot
of model instances.
--
Ticket URL: <
https://code.djangoproject.com/ticket/35405>
Django <
https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.