Opened 7 months ago
Last modified 6 months ago
#35408 closed Cleanup/optimization
Optimize post-migrate permission creation — at Initial Version
Reported by: | Adam Johnson | Owned by: | Adam Johnson |
---|---|---|---|
Component: | contrib.auth | Version: | dev |
Severity: | Normal | Keywords: | |
Cc: | Triage Stage: | Ready for checkin | |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
I have often seen django.contrib.auth.management.create_permissions()
take a significant amount of time in test run profiles. It can be optimized by batching more of its operations, including making ContentTypeManager.get_for_models()
use batch creation.
For a comparison, I profiled 1518 of Django’s 1518 tests in modules called “models”:
$ python -m cProfile -o profile runtests.py --parallel 1 *model* $ python -m pstats profile <<< 'sort cumtime stats 10000' | less
Before optimization stats:
- Total 11,938,857 function calls taking 5.349 seconds.
- 88 calls to
create_permissions()
take 456ms, ~8.5% of the total time.
After optimization stats:
- Total 11,359,071 function calls taking 5.035 seconds.
- 88 calls to
create_permissions()
now take 239ms, ~4.7% of the toal time. - 217ms and 579,786 function calls saved.
Optimization is limited because the post_migrate
signal runs once per migrated app config, so there’s no chance to bulk create *all* content types and permissions at once. If we introduced a new “all migrated apps” signal, that could reduce runtime further by batching all creation.