Speed up enumerate_subtree()
Searching a set is faster than searching a list, and changing this
particular spot to a set cut the function's overall execution time
by half when enumerating 200 /xyz/openbmc_project/logging objects,
from ~15s down to about 6 (with system power off).
Also removed the list() conversions that tend to be slow and aren't
really needed for python3 anyway.
Resolves openbmc/openbmc#3199
Change-Id: Id4534b7c3aee1017164f6d01e9028a8bcf0e9cd2
Signed-off-by: Matt Spinler <spinler@us.ibm.com>
diff --git a/obmc/mapper/bindings.py b/obmc/mapper/bindings.py
index f5f96d0..8fbcd51 100644
--- a/obmc/mapper/bindings.py
+++ b/obmc/mapper/bindings.py
@@ -122,7 +122,7 @@
obj = {}
- for owner, interfaces in list(mapper_data[path].items()):
+ for owner, interfaces in mapper_data[path].items():
obj.update(
self.__get_properties_on_bus(
path, owner, interfaces, match))
@@ -140,8 +140,8 @@
# look for objectmanager implementations as they result
# in fewer dbus calls
- for path, bus_data in list(mapper_data.items()):
- for owner, interfaces in list(bus_data.items()):
+ for path, bus_data in mapper_data.items():
+ for owner, interfaces in bus_data.items():
owners.append(owner)
if dbus.BUS_DAEMON_IFACE + '.ObjectManager' in interfaces:
managers[owner] = path
@@ -156,14 +156,16 @@
if e.get_dbus_name() != MAPPER_NOT_FOUND:
raise
- for path, bus_data in list(ancestors.items()):
- for owner, interfaces in list(bus_data.items()):
+ for path, bus_data in ancestors.items():
+ for owner, interfaces in bus_data.items():
if dbus.BUS_DAEMON_IFACE + '.ObjectManager' in interfaces:
managers[owner] = path
+ mapper_keys = set(mapper_data.keys())
+
# make all the manager gmo (get managed objects) calls
results = {}
- for owner, path in list(managers.items()):
+ for owner, path in managers.items():
if owner not in owners:
continue
obj = self.bus.get_object(owner, path, introspect=False)
@@ -172,17 +174,17 @@
# flatten (remove interface names) gmo results
for path, interfaces in \
- list(iface.GetManagedObjects().items()):
- if path not in iter(list(mapper_data.keys())):
+ iface.GetManagedObjects().items():
+ if path not in mapper_keys:
continue
properties = {}
- for iface, props in list(interfaces.items()):
+ for iface, props in interfaces.items():
properties.update(props)
results.setdefault(path, {}).setdefault(owner, properties)
# make dbus calls for any remaining objects
- for path, bus_data in list(mapper_data.items()):
- for owner, interfaces in list(bus_data.items()):
+ for path, bus_data in mapper_data.items():
+ for owner, interfaces in bus_data.items():
if results.setdefault(path, {}).setdefault(owner, {}):
continue
results[path][owner].update(
@@ -190,8 +192,8 @@
path, owner, interfaces, match))
objs = obmc.utils.pathtree.PathTree()
- for path, owners in list(results.items()):
- for owner, properties in list(owners.items()):
+ for path, owners in results.items():
+ for owner, properties in owners.items():
objs.setdefault(path, {}).update(properties)
return objs