summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Meyer <carl@oddbird.net>2014-11-15 18:56:52 +0100
committerCarl Meyer <carl@oddbird.net>2014-11-15 18:56:52 +0100
commit1ed9b9e2e2b62f6ef89558f98d786e9fcd649152 (patch)
tree366b5808c6f74c7d995e20a7eb87ac0b060c9469
parent35dac5070bc3422cd2c6c2f46a28d1a1af2a2c50 (diff)
parentfefb77934e6b8f91ce44be7e1438146cb99baa19 (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.py17
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))