from collections import namedtuple Obj = namedtuple("Obj", ["name", "has_something", "do_something", "dependencies"]) class XObj(object): def __init__(self, name, has_something, do_something, dependencies): self.name = name self.has_something = has_something self.do_something = do_something self.dependencies = dependencies def one(): obj = Obj("foo", 1, False, {"bar": Obj("bar", 0, False, None), "baz": Obj("baz", 1, False, None), "foo2": Obj("foo2", 1, True, None)}) l = {"foo": obj} while l: k, x = l.popitem() if x.has_something: if not hasattr(x, 'has_something_else'): pass if x.dependencies: for v in x.dependencies.itervalues(): l[v.name] = v if x.do_something: pass def three(): Obj = XObj obj = Obj("foo", 1, False, None) l = {"foo": obj} obj.dependencies = {"bar": Obj("bar", 0, False, None), "baz": Obj("baz", 1, False, None), "foo2": Obj("foo2", 1, True, None)} while l: k, x = l.popitem() if x.has_something: if not hasattr(x, 'has_something_else'): pass if x.dependencies: for v in x.dependencies.itervalues(): l[v.name] = v if x.do_something: pass has_something = dict.fromkeys(["something", "baz", "foo2", "foo"]) has_something_else = dict.fromkeys(["has_something_else", "foo2"]) do_something = dict.fromkeys(["do_something"]) def two(): l = {"foo": None} dependencies = {"foo": dict.fromkeys(["bar", "baz", "foo2"])} while l: k, _ = l.popitem() if k in has_something: if k not in has_something_else: pass if k in dependencies: for v in dependencies[k]: l[v] = None if k in do_something: pass import time tp = time.time() for i in range(1000000): three() t0 = time.time() for i in range(1000000): two() t1 = time.time() for i in range(1000000): one() t2 = time.time() print t2-t1, t1-t0, t0-tp