提交 d124492d authored 作者: Frederic Bastien's avatar Frederic Bastien 提交者: Reyhane Askari

Change the order returned by io_toposort. Speed up io_toposort with no ordering…

Change the order returned by io_toposort. Speed up io_toposort with no ordering for graph bigger then ~10 nodes.
上级 69697cee
...@@ -991,21 +991,26 @@ def io_toposort(inputs, outputs, orderings=None, clients=None): ...@@ -991,21 +991,26 @@ def io_toposort(inputs, outputs, orderings=None, clients=None):
compute_deps = None compute_deps = None
compute_deps_cache = None compute_deps_cache = None
if not orderings: # can be None or empty dict if not orderings: # can be None or empty dict
# Specialized function that is faster when no ordering. # Specialized function that is faster when more then ~10 nodes
# Also include the cache in the function itself for speed up. # when no ordering.
def compute_deps_cache(obj):
if obj in deps_cache: # Do a new stack implementation with the vm algo.
return deps_cache[obj] # This will change the order returned.
rval = [] computed = set(inputs)
if obj not in iset: todo = [o.owner for o in outputs if o.owner]
if isinstance(obj, Variable): order = []
if obj.owner: while todo:
rval = [obj.owner] cur = todo.pop()
elif isinstance(obj, Apply): # We suppose that all outputs are always computed
rval = obj.inputs if cur.outputs[0] in computed:
deps_cache[obj] = rval continue
return rval if all([i in computed or i.owner is None for i in cur.inputs]):
computed.update(cur.outputs)
order.append(cur)
else:
todo.append(cur)
todo.extend(i.owner for i in cur.inputs if i.owner)
return order
else: else:
def compute_deps(obj): def compute_deps(obj):
rval = [] rval = []
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论