Skip to content

Commit 072c40c

Browse files
authored
perf: use deque for BFS queue in graph traversal (#1494)
* perf: use deque for BFS queue in graph traversal compute_nodes_from_sources() drains a BFS queue via .pop(0) which is O(n) per removal. Switch to collections.deque with .popleft() for O(1) front removal. * fix: sort imports per ruff I001
1 parent 7d831f3 commit 072c40c

File tree

1 file changed

+3
-2
lines changed

1 file changed

+3
-2
lines changed

hamilton/execution/graph_functions.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import logging
1919
import pprint
20+
from collections import deque
2021
from collections.abc import Collection
2122
from functools import partial
2223
from typing import Any
@@ -65,12 +66,12 @@ def topologically_sort_nodes(nodes: list[node.Node]) -> list[node.Node]:
6566
in_degrees = {node_.name: len(dependency_map.get(node_.name, [])) for node_ in nodes}
6667
# TODO -- determine what happens if nodes have dependencies that aren't present
6768
sources = [node_ for node_ in nodes if in_degrees[node_.name] == 0]
68-
queue = []
69+
queue = deque()
6970
for source in sources:
7071
queue.append(source)
7172
sorted_nodes = []
7273
while len(queue) > 0:
73-
node_ = queue.pop(0)
74+
node_ = queue.popleft()
7475
sorted_nodes.append(node_)
7576
for next_node in depended_on_by_map.get(node_.name, []):
7677
if next_node.name in in_degrees:

0 commit comments

Comments
 (0)