#24366: Improve migration dependency graph speed
------------------------------------------------+------------------------
               Reporter:  MarkusH               |          Owner:  nobody
                   Type:  Cleanup/optimization  |         Status:  new
              Component:  Migrations            |        Version:  master
               Severity:  Normal                |       Keywords:
           Triage Stage:  Unreviewed            |      Has patch:  0
    Needs documentation:  0                     |    Needs tests:  0
Patch needs improvement:  0                     |  Easy pickings:  0
                  UI/UX:  0                     |
------------------------------------------------+------------------------
 With a bout 750 migration files and a total of about 1250 dependency
 definitions I end up with the following cProfile stats when calling
 `executor.migrate_plan(targets)` in the migrate command:

 {{{
    ncalls  tottime  percall  cumtime  percall filename:lineno(function)
         1    0.000    0.000  929.770  929.770 <string>:1(<module>)
        38    0.001    0.000  229.709    6.045 __init__.py:41(__init__)
  63854649  100.666    0.000  101.193    0.000 __init__.py:58(__setitem__)
     16077    0.009    0.000    0.009    0.000 __init__.py:83(__iter__)
        38    0.000    0.000    0.000    0.000
 _collections_abc.py:437(keys)
        38    0.000    0.000    0.000    0.000
 _collections_abc.py:462(__init__)
     16077    0.007    0.000    0.016    0.000
 _collections_abc.py:481(__iter__)
        38  103.342    2.720  229.708    6.045
 _collections_abc.py:581(update)
        76    0.000    0.000    0.000    0.000
 _weakrefset.py:70(__contains__)
        38    0.000    0.000    0.001    0.000
 abc.py:178(__instancecheck__)
        38    0.001    0.000  229.710    6.045
 datastructures.py:13(__init__)
  63854687   25.172    0.000   25.172    0.000
 datastructures.py:14(<genexpr>)
        38    0.000    0.000    0.001    0.000
 datastructures.py:28(__iter__)
         1    0.051    0.051  929.770  929.770
 executor.py:23(migration_plan)
        12    0.000    0.000    0.000    0.000 executor.py:49(<genexpr>)
        38    0.350    0.009    0.504    0.013
 graph.py:109(ensure_not_cyclic)
        38  251.357    6.615  929.097   24.450 graph.py:129(dfs)
        38    0.622    0.016  929.719   24.466 graph.py:58(forwards_plan)
  63909407  102.207    0.000  141.411    0.000 graph.py:67(<lambda>)
         1    0.000    0.000  929.770  929.770 {built-in method exec}
        38    0.000    0.000    0.000    0.000 {built-in method hasattr}
        38    0.000    0.000    0.001    0.000 {built-in method isinstance}
        38    0.000    0.000    0.000    0.000 {built-in method iter}
       114    0.000    0.000    0.000    0.000 {built-in method len}
     16077    0.527    0.000    0.527    0.000 {built-in method proxy}
  63854661  259.600    0.000  259.600    0.000 {built-in method sorted}
       408    0.000    0.000    0.000    0.000 {method 'add' of 'set'
 objects}
        38    0.000    0.000    0.000    0.000 {method 'append' of
 'collections.deque' objects}
     26476    0.006    0.000    0.006    0.000 {method 'append' of 'list'
 objects}
  63854611   10.834    0.000   10.834    0.000 {method 'appendleft' of
 'collections.deque' objects}
         1    0.000    0.000    0.000    0.000 {method 'disable' of
 '_lsprof.Profiler' objects}
  63854611   26.316    0.000   26.316    0.000 {method 'extendleft' of
 'collections.deque' objects}
  63909419   39.204    0.000   39.204    0.000 {method 'get' of 'dict'
 objects}
        38    0.000    0.000    0.000    0.000 {method 'items' of 'dict'
 objects}
        38    0.000    0.000    0.000    0.000 {method 'keys' of 'dict'
 objects}
     28690    0.010    0.000    0.010    0.000 {method 'pop' of 'list'
 objects}
      2622    0.001    0.000    0.001    0.000 {method 'pop' of 'set'
 objects}
  63854611    9.471    0.000    9.471    0.000 {method 'popleft' of
 'collections.deque' objects}
     26068    0.014    0.000    0.014    0.000 {method 'remove' of 'set'
 objects}
 }}}

 I think this applies to 1.7+, though I only tested it on the current
 master

--
Ticket URL: <https://code.djangoproject.com/ticket/24366>
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 post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/050.d854aaf156ad425eea2a99058e5b9ade%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to