Оптимизировать функцию сортировки списка кортежей - PullRequest
1 голос
/ 09 января 2010

Мне нужно отсортировать список кортежей по первому элементу в порядке убывания, а затем по второму элементу в порядке возрастания.

Для этого я реализовал следующую функцию, но я думаю, что она может быть быстрее.

>>> compare = lambda a, b: -cmp(b[1], a[1]) if b[0] == a[0] else cmp(b[0], a[0])
>>> sorted([(0, 2), (0, 1), (1, 0), (1, 2)], cmp=compare)
[(1, 0), (1, 2), (0, 1), (0, 2)]

Можно ли его оптимизировать? Смотрите сравнение со встроенной функцией:

>>> timeit.Timer(stmt='sorted([(int(random.getrandbits(4)),int(random.getrandbits(4))) for x in xrange(10)], cmp=compare)', setup='import random; compare=compare = lambda a, b: -cmp(b[1], a[1]) if b[0] == a[0] else cmp(b[0], a[0])').timeit(100000)
4.0584850867917339
>>> timeit.Timer(stmt='sorted([(int(random.getrandbits(4)),int(random.getrandbits(4))) for x in xrange(10)])', setup='import random').timeit(100000)
2.6582965153393161

Ответы [ 2 ]

8 голосов
/ 09 января 2010

Для меня немного быстрее использовать ключ вместо функции сравнения, и, возможно, также легче читать:

sorted([(0, 2), (0, 1), (1, 0), (1, 2)], key = lambda x:(-x[0], x[1]))

Для этого требуется Python 2.4 или новее.

0 голосов
/ 09 января 2010

Как это складывается для вас?

compare = lambda a, b: cmp(b[0], a[0]) and cmp(a[1],b[1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...