Przeglądaj źródła

Prefer xrange over range for small performance gain.

range() allocates an actual list when called.  xrange() is just an iterator
and creates the next range item on demand.  This provides a slight
performance increase.

In python 3, range will do what xrange does currently, but the upgrade will
be handled by the 2to3 tool.

Signed-off-by: Bob Foerster <robert@erafx.com>
Bob Foerster 13 lat temu
rodzic
commit
73b40f0644
4 zmienionych plików z 31 dodań i 31 usunięć
  1. 1 1
      lib/bb/cooker.py
  2. 21 21
      lib/bb/runqueue.py
  3. 4 4
      lib/bb/taskdata.py
  4. 5 5
      lib/bb/utils.py

+ 1 - 1
lib/bb/cooker.py

@@ -288,7 +288,7 @@ class BBCooker:
         depend_tree["rdepends-pkg"] = {}
         depend_tree["rrecs-pkg"] = {}
 
-        for task in range(len(rq.runq_fnid)):
+        for task in xrange(len(rq.runq_fnid)):
             taskname = rq.runq_task[task]
             fnid = rq.runq_fnid[task]
             fn = taskdata.fn_index[fnid]

+ 21 - 21
lib/bb/runqueue.py

@@ -97,7 +97,7 @@ class RunQueueScheduler(object):
         """
         Return the id of the first task we find that is buildable
         """
-        for tasknum in range(len(self.rq.runq_fnid)):
+        for tasknum in xrange(len(self.rq.runq_fnid)):
             taskid = self.prio_map[tasknum]
             if self.rq.runq_running[taskid] == 1:
                 continue
@@ -229,7 +229,7 @@ class RunQueue:
         return "%s, %s" % (fn, taskname)
 
     def get_task_id(self, fnid, taskname):
-        for listid in range(len(self.runq_fnid)):
+        for listid in xrange(len(self.runq_fnid)):
             if self.runq_fnid[listid] == fnid and self.runq_task[listid] == taskname:
                 return listid
         return None
@@ -251,7 +251,7 @@ class RunQueue:
             """
             lowest = 0
             new_chain = []
-            for entry in range(len(chain)):
+            for entry in xrange(len(chain)):
                 if chain[entry] < chain[lowest]:
                     lowest = entry
             new_chain.extend(chain[lowest:])
@@ -264,7 +264,7 @@ class RunQueue:
             """
             if len(chain1) != len(chain2):
                 return False
-            for index in range(len(chain1)):
+            for index in xrange(len(chain1)):
                 if chain1[index] != chain2[index]:
                     return False
             return True
@@ -335,7 +335,7 @@ class RunQueue:
         deps_left = []
         task_done = []
 
-        for listid in range(numTasks):
+        for listid in xrange(numTasks):
             task_done.append(False)
             weight.append(0)
             deps_left.append(len(self.runq_revdeps[listid]))
@@ -359,7 +359,7 @@ class RunQueue:
 
         # Circular dependency sanity check
         problem_tasks = []
-        for task in range(numTasks):
+        for task in xrange(numTasks):
             if task_done[task] is False or deps_left[task] != 0:
                 problem_tasks.append(task)
                 logger.debug(2, "Task %s (%s) is not buildable\n", task, self.get_user_idstring(task))
@@ -437,7 +437,7 @@ class RunQueue:
                     if taskid is not None:
                         depends.append(taskid)
 
-        for task in range(len(taskData.tasks_name)):
+        for task in xrange(len(taskData.tasks_name)):
             depends = []
             recrdepends = []
             fnid = taskData.tasks_fnid[task]
@@ -527,7 +527,7 @@ class RunQueue:
         # Algorithm is O(tasks) + O(tasks)*O(fnids)
         #
         reccumdepends = {}
-        for task in range(len(self.runq_fnid)):
+        for task in xrange(len(self.runq_fnid)):
             fnid = self.runq_fnid[task]
             if fnid not in reccumdepends:
                 if fnid in tdepends_fnid:
@@ -535,7 +535,7 @@ class RunQueue:
                 else:
                     reccumdepends[fnid] = set()
             reccumdepends[fnid].update(self.runq_depends[task])
-        for task in range(len(self.runq_fnid)):
+        for task in xrange(len(self.runq_fnid)):
             taskfnid = self.runq_fnid[task]
             for fnid in reccumdepends:
                 if task in reccumdepends[fnid]:
@@ -548,7 +548,7 @@ class RunQueue:
         #
         # e.g. do_sometask[recrdeptask] = "do_someothertask"
         # (makes sure sometask runs after someothertask of all DEPENDS, RDEPENDS and intertask dependencies, recursively)
-        for task in range(len(self.runq_fnid)):
+        for task in xrange(len(self.runq_fnid)):
             if len(runq_recrdepends[task]) > 0:
                 taskfnid = self.runq_fnid[task]
                 for dep in reccumdepends[taskfnid]:
@@ -617,7 +617,7 @@ class RunQueue:
 
         maps = []
         delcount = 0
-        for listid in range(len(self.runq_fnid)):
+        for listid in xrange(len(self.runq_fnid)):
             if runq_build[listid-delcount] == 1:
                 maps.append(listid-delcount)
             else:
@@ -644,7 +644,7 @@ class RunQueue:
 
         # Remap the dependencies to account for the deleted tasks
         # Check we didn't delete a task we depend on
-        for listid in range(len(self.runq_fnid)):
+        for listid in xrange(len(self.runq_fnid)):
             newdeps = []
             origdeps = self.runq_depends[listid]
             for origdep in origdeps:
@@ -656,14 +656,14 @@ class RunQueue:
         logger.verbose("Assign Weightings")
 
         # Generate a list of reverse dependencies to ease future calculations
-        for listid in range(len(self.runq_fnid)):
+        for listid in xrange(len(self.runq_fnid)):
             for dep in self.runq_depends[listid]:
                 self.runq_revdeps[dep].add(listid)
 
         # Identify tasks at the end of dependency chains
         # Error on circular dependency loops (length two)
         endpoints = []
-        for listid in range(len(self.runq_fnid)):
+        for listid in xrange(len(self.runq_fnid)):
             revdeps = self.runq_revdeps[listid]
             if len(revdeps) == 0:
                 endpoints.append(listid)
@@ -690,7 +690,7 @@ class RunQueue:
         # Sanity Check - Check for multiple tasks building the same provider
         prov_list = {}
         seen_fn = []
-        for task in range(len(self.runq_fnid)):
+        for task in xrange(len(self.runq_fnid)):
             fn = taskData.fn_index[self.runq_fnid[task]]
             if fn in seen_fn:
                 continue
@@ -736,7 +736,7 @@ class RunQueue:
             if self.stamppolicy == "whitelist":
                 stampwhitelist = self.self.stampfnwhitelist
 
-        for task in range(len(self.runq_fnid)):
+        for task in xrange(len(self.runq_fnid)):
             unchecked[task] = ""
             if len(self.runq_depends[task]) == 0:
                 buildable.append(task)
@@ -751,7 +751,7 @@ class RunQueue:
                     if revdep in unchecked:
                         buildable.append(revdep)
 
-        for task in range(len(self.runq_fnid)):
+        for task in xrange(len(self.runq_fnid)):
             if task not in unchecked:
                 continue
             fn = self.taskData.fn_index[self.runq_fnid[task]]
@@ -910,7 +910,7 @@ class RunQueue:
         self.failed_fnids = []
 
         # Mark initial buildable tasks
-        for task in range(self.stats.total):
+        for task in xrange(self.stats.total):
             self.runq_running.append(0)
             self.runq_complete.append(0)
             if len(self.runq_depends[task]) == 0:
@@ -1010,7 +1010,7 @@ class RunQueue:
                 return
 
             # Sanity Checks
-            for task in range(self.stats.total):
+            for task in xrange(self.stats.total):
                 if self.runq_buildable[task] == 0:
                     logger.error("Task %s never buildable!", task)
                 if self.runq_running[task] == 0:
@@ -1130,7 +1130,7 @@ class RunQueue:
         Dump some debug information on the internal data structures
         """
         logger.debug(3, "run_tasks:")
-        for task in range(len(self.runq_task)):
+        for task in xrange(len(self.runq_task)):
             logger.debug(3, " (%s)%s - %s: %s   Deps %s RevDeps %s", task,
                        taskQueue.fn_index[self.runq_fnid[task]],
                        self.runq_task[task],
@@ -1139,7 +1139,7 @@ class RunQueue:
                        self.runq_revdeps[task])
 
         logger.debug(3, "sorted_tasks:")
-        for task1 in range(len(self.runq_task)):
+        for task1 in xrange(len(self.runq_task)):
             if task1 in self.prio_map:
                 task = self.prio_map[task1]
                 logger.debug(3, " (%s)%s - %s: %s   Deps %s RevDeps %s", task,

+ 4 - 4
lib/bb/taskdata.py

@@ -493,7 +493,7 @@ class TaskData:
         dependees = self.get_dependees(targetid)
         for fnid in dependees:
             self.fail_fnid(fnid, missing_list)
-        for taskid in range(len(self.tasks_idepends)):
+        for taskid in xrange(len(self.tasks_idepends)):
             idepends = self.tasks_idepends[taskid]
             for (idependid, idependtask) in idepends:
                 if idependid == targetid:
@@ -558,7 +558,7 @@ class TaskData:
         logger.debug(3, ", ".join(self.run_names_index))
 
         logger.debug(3, "build_targets:")
-        for buildid in range(len(self.build_names_index)):
+        for buildid in xrange(len(self.build_names_index)):
             target = self.build_names_index[buildid]
             targets = "None"
             if buildid in self.build_targets:
@@ -566,7 +566,7 @@ class TaskData:
             logger.debug(3, " (%s)%s: %s", buildid, target, targets)
 
         logger.debug(3, "run_targets:")
-        for runid in range(len(self.run_names_index)):
+        for runid in xrange(len(self.run_names_index)):
             target = self.run_names_index[runid]
             targets = "None"
             if runid in self.run_targets:
@@ -574,7 +574,7 @@ class TaskData:
             logger.debug(3, " (%s)%s: %s", runid, target, targets)
 
         logger.debug(3, "tasks:")
-        for task in range(len(self.tasks_name)):
+        for task in xrange(len(self.tasks_name)):
             logger.debug(3, " (%s)%s - %s: %s",
                        task,
                        self.fn_index[self.tasks_fnid[task]],

+ 5 - 5
lib/bb/utils.py

@@ -194,10 +194,10 @@ def vercmp_string(val1, val2):
     val2 = val2[0].split('.')
 
     # add back decimal point so that .03 does not become "3" !
-    for x in range(1, len(val1)):
+    for x in xrange(1, len(val1)):
         if val1[x][0] == '0' :
             val1[x] = '.' + val1[x]
-    for x in range(1, len(val2)):
+    for x in xrange(1, len(val2)):
         if val2[x][0] == '0' :
             val2[x] = '.' + val2[x]
 
@@ -214,10 +214,10 @@ def vercmp_string(val1, val2):
         val2[-1] += '_' + val2_prepart
     # The above code will extend version numbers out so they
     # have the same number of digits.
-    for x in range(0, len(val1)):
+    for x in xrange(0, len(val1)):
         cmp1 = relparse(val1[x])
         cmp2 = relparse(val2[x])
-        for y in range(0, 3):
+        for y in xrange(0, 3):
             myret = cmp1[y] - cmp2[y]
             if myret != 0:
                 __vercmp_cache__[valkey] = myret
@@ -298,7 +298,7 @@ def _print_trace(body, line):
     logger.error("Printing the environment of the function")
     min_line = max(1, line-4)
     max_line = min(line + 4, len(body)-1)
-    for i in range(min_line, max_line + 1):
+    for i in xrange(min_line, max_line + 1):
         logger.error("\t%.4d:%s", i, body[i-1])