diff options
| author | Carl Meyer <carl@oddbird.net> | 2014-11-15 18:56:52 +0100 |
|---|---|---|
| committer | Carl Meyer <carl@oddbird.net> | 2014-11-15 18:56:52 +0100 |
| commit | 1ed9b9e2e2b62f6ef89558f98d786e9fcd649152 (patch) | |
| tree | 366b5808c6f74c7d995e20a7eb87ac0b060c9469 | |
| parent | 35dac5070bc3422cd2c6c2f46a28d1a1af2a2c50 (diff) | |
| parent | fefb77934e6b8f91ce44be7e1438146cb99baa19 (diff) | |
Merge pull request #3536 from Zweedeend/ticket_23837
Fixes #23837: Replace list with deque in migration-planner for improved performance.
| -rw-r--r-- | django/db/migrations/graph.py | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/django/db/migrations/graph.py b/django/db/migrations/graph.py index b454d17f35..a2c14f2ba6 100644 --- a/django/db/migrations/graph.py +++ b/django/db/migrations/graph.py @@ -1,4 +1,5 @@ from __future__ import unicode_literals +from collections import deque from django.db.migrations.state import ProjectState from django.utils.datastructures import OrderedSet @@ -100,26 +101,28 @@ class MigrationGraph(object): def dfs(self, start, get_children): """ - Dynamic programming based depth first search, for finding dependencies. + Iterative depth first search, for finding dependencies. """ - visited = [] + visited = deque() visited.append(start) path = [start] - stack = sorted(get_children(start)) + stack = deque(sorted(get_children(start))) while stack: - node = stack.pop(0) + node = stack.popleft() if node in path: raise CircularDependencyError() path.append(node) - visited.insert(0, node) - children = sorted(get_children(node)) + visited.appendleft(node) + children = sorted(get_children(node), reverse=True) + # reverse sorting is needed because prepending using deque.extendleft + # also effectively reverses values if path[-1] == node: path.pop() - stack = children + stack + stack.extendleft(children) return list(OrderedSet(visited)) |
