#964 few sort speedups
Merged 5 years ago by mikem. Opened 5 years ago by tkopecek.
tkopecek/koji issue963  into  master

file modified
+2 -4
@@ -2239,7 +2239,7 @@ 

      if childMap == None:

          childMap = {}

      children = task.getChildren(request=request)

-     children.sort(lambda a, b: cmp(a['id'], b['id']))

+     children.sort(key=lambda x: x['id'])

      # xmlrpclib requires dict keys to be strings

      childMap[str(task.id)] = children

      for child in children:
@@ -8006,9 +8006,7 @@ 

          if order.startswith('-'):

              order = order[1:]

              reverse = True

-         results.sort(key=lambda o: o[order])

-         if reverse:

-             results.reverse()

+         results.sort(key=lambda o: o[order], reverse=reverse)

      if queryOpts.get('offset'):

          results = results[queryOpts['offset']:]

      if queryOpts.get('limit'):

file modified
+1 -2
@@ -50,8 +50,7 @@ 

              mplist.append(path)

      fo.close()

      #reverse sort so deeper dirs come first

-     mplist.sort()

-     mplist.reverse()

+     mplist.sort(reverse=True)

      return mplist

  

  def umount_all(topdir):

file modified
+2 -1
@@ -283,7 +283,8 @@ 

          for msg in msgs:

              log.debug('test mode: skipped msg: %r', msg)

          return

-     for url in sorted(urls, key=lambda k: random.random()):

+     random.shuffle(urls)

+     for url in urls:

          container = Container(TimeoutHandler(url, msgs, CONFIG))

          container.run()

          if msgs:

file modified
+1 -2
@@ -1154,8 +1154,7 @@ 

                  problem_counts[nvr] += 1

          order = [(c, nvr) for (nvr, c) in six.iteritems(problem_counts)]

          if order:

-             order.sort()

-             order.reverse()

+             order.sort(reverse=True)

              #print top 5 problems

              log("-- top problems --")

              for (c, nvr) in order[:5]:

file modified
+1 -1
@@ -688,7 +688,7 @@ 

      paths = [] # (volume, relpath) tuples

      for relname, volumes in six.iteritems(server.listTaskOutput(task['id'], all_volumes=True)):

          paths += [(volume, relname) for volume in volumes]

-     values['output'] = sorted(paths, key = _sortByExtAndName)

+     values['output'] = sorted(paths, key=_sortByExtAndName)

      if environ['koji.currentUser']:

          values['perms'] = server.getUserPerms(environ['koji.currentUser']['id'])

      else:

Fixes: https://pagure.io/koji/issue/963

Also l.sort() is in case of larger lists faster than l = sorted(l)

l = [{'a': random.random()} for x in xrange(1000000)]
x = l[:]

%timeit sorted(l, key=lambda x: x['a'])
1 loop, best of 3: 1.62 s per loop

%timeit -r 1 x.sort(key=lambda x: x['a'])
1 loop, best of 1: 625 ms per loop

In py3 are differences smaller (818ms vs 547ms), but still in favor of l.sort()

rebased onto 3ae5a9b

5 years ago

Commit f71804d fixes this pull-request

Pull-Request has been merged by mikem

5 years ago