From 7d236a6a998b40162969d4675d5f08882604bfa2 Mon Sep 17 00:00:00 2001 From: James Beilsten-Edmands <30625594+jbeilstenedmands@users.noreply.github.com> Date: Tue, 22 Aug 2023 11:00:42 +0100 Subject: [PATCH] Fix slowness of loading large experiment lists due to pkg_resources->importlib change --- newsfragments/XXX.bugfix | 1 + src/dxtbx/model/experiment_list.py | 7 ++++++- src/dxtbx/model/profile.py | 4 +++- 3 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 newsfragments/XXX.bugfix diff --git a/newsfragments/XXX.bugfix b/newsfragments/XXX.bugfix new file mode 100644 index 000000000..0c3afe93e --- /dev/null +++ b/newsfragments/XXX.bugfix @@ -0,0 +1 @@ +Fix slowness of loading large experiment lists with profile/scaling models diff --git a/src/dxtbx/model/experiment_list.py b/src/dxtbx/model/experiment_list.py index b357d99da..0453666e7 100644 --- a/src/dxtbx/model/experiment_list.py +++ b/src/dxtbx/model/experiment_list.py @@ -59,6 +59,11 @@ class InvalidExperimentListError(RuntimeError): """ +scaling_model_entry_points = importlib.metadata.entry_points()[ + "dxtbx.scaling_model_ext" +] + + class FormatChecker: """A helper class to speed up identifying the correct image format by first trying the last format that was used.""" @@ -576,7 +581,7 @@ def _lookup_model(self, name, experiment_dict): @staticmethod def _scaling_model_from_dict(obj): """Get the scaling model from a dictionary.""" - for entry_point in importlib.metadata.entry_points()["dxtbx.scaling_model_ext"]: + for entry_point in scaling_model_entry_points: if entry_point.name == obj["__id__"]: return entry_point.load().from_dict(obj) diff --git a/src/dxtbx/model/profile.py b/src/dxtbx/model/profile.py index ba3852586..422fe5429 100644 --- a/src/dxtbx/model/profile.py +++ b/src/dxtbx/model/profile.py @@ -3,6 +3,8 @@ import importlib.metadata import logging +profile_entry_points = importlib.metadata.entry_points()["dxtbx.profile_model"] + class ProfileModelFactory: """ @@ -16,7 +18,7 @@ def from_dict(obj): """ if obj is None: return None - for entry_point in importlib.metadata.entry_points()["dxtbx.profile_model"]: + for entry_point in profile_entry_points: if entry_point.name == obj["__id__"]: return entry_point.load().from_dict(obj) logging.getLogger("dxtbx.model.profile").warn(