#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 django-updates+unsubscr...@googlegroups.com.
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