#!/usr/bin/env python3 from operator import itemgetter import timeit items = [{'url': 'http://aaa/', 'user': 'xxx', 'quota': 100}, {'url': 'http://aaa/', 'user': 'yyy', 'quota': 200}, {'url': 'http://bbb/', 'user': 'xxx', 'quota': 100}, {'url': 'http://bbb/', 'user': 'yyy', 'quota': 200} ] * 100 keyspec = [ (itemgetter('url'), False), (itemgetter('user'), True), ] def keygen(ks): class _: def __init__(self, v): self.v = v def __lt__(self, o): return o.v < self.v return lambda x: [ _(k(x)) if r else k(x) for k, r in ks ] print("Multiple pass sort : ") print(timeit.timeit(stmt= lambda : sorted(sorted(items, key=lambda r: itemgetter('user')(r), reverse=True), key=lambda r: itemgetter('url')(r)), number=10000)) print("Suggested sort : ") print(timeit.timeit(stmt= lambda : sorted(items, key=keygen(keyspec)), number=10000)) multiple_pass_sort = sorted(sorted(items, key=lambda r: itemgetter('user')(r), reverse=True), key=lambda r: itemgetter('url')(r)) suggested_sort = sorted(items, key=keygen(keyspec)) assert multiple_pass_sort == suggested_sort