#35408: Optimize post-migrate permission creation
-------------------------------------+-------------------------------------
               Reporter:  Adam       |          Owner:  Adam Johnson
  Johnson                            |
                   Type:             |         Status:  assigned
  Cleanup/optimization               |
              Component:             |        Version:  dev
  contrib.auth                       |
               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          |
-------------------------------------+-------------------------------------
 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.
-- 
Ticket URL: <https://code.djangoproject.com/ticket/35408>
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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/0107018f19dd8fda-3a88cb27-5b7a-4a66-97a4-61373eec9a6f-000000%40eu-central-1.amazonses.com.

Reply via email to