diff --git a/changelog/632.feature.rst b/changelog/632.feature.rst new file mode 100644 index 00000000..2c023bcf --- /dev/null +++ b/changelog/632.feature.rst @@ -0,0 +1 @@ +LoadScope scheduler: Sort scopes by number of tests to assign biggest scopes first. \ No newline at end of file diff --git a/src/xdist/scheduler/loadscope.py b/src/xdist/scheduler/loadscope.py index 31dbe26c..59c262d5 100644 --- a/src/xdist/scheduler/loadscope.py +++ b/src/xdist/scheduler/loadscope.py @@ -349,11 +349,18 @@ def schedule(self): return # Determine chunks of work (scopes) + unsorted_workqueue = OrderedDict() for nodeid in self.collection: scope = self._split_scope(nodeid) - work_unit = self.workqueue.setdefault(scope, default=OrderedDict()) + work_unit = unsorted_workqueue.setdefault(scope, default=OrderedDict()) work_unit[nodeid] = False + # Insert tests scopes into work queue ordered by number of tests + for scope, nodeids in sorted( + unsorted_workqueue.items(), key=lambda item: -len(item[1]) + ): + self.workqueue[scope] = nodeids + # Avoid having more workers than work extra_nodes = len(self.nodes) - len(self.workqueue)