Удивительно, но обратная сортировка списка занимает больше времени. Другие ответы уже показали это с хорошими оценками. Я заглянул в источник и нашел объяснение в listobject.c
:
/* Reverse sort stability achieved by initially reversing the list,
applying a stable forward sort, then reversing the final result. */
if (reverse) {
if (keys != NULL)
reverse_slice(&keys[0], &keys[saved_ob_size]);
reverse_slice(&saved_ob_item[0], &saved_ob_item[saved_ob_size]);
}
Итак, чтобы получить отсортированный вывод, перед сортировкой список переворачивается, затем сортируется и, наконец, снова переворачивается. Сторнирование списка - это операция O ( n ), поэтому чем больше вы заплатите, тем длиннее список.
Это говорит о том, что если вы в любом случае создаете пользовательскую функцию ключа, то вы можете сэкономить время для больших списков, отрицая ее напрямую:
very_long_list.sort(key=lambda x, y: -cmp(x, y))
вместо использования reversed=True
:
very_long_list.sort(key=lambda x, y: cmp(x, y), reverse=True)
В этом случае, конечно, вы можете передать key=cmp
непосредственно во втором случае и, таким образом, сохранить дополнительный вызов с помощью лямбда-функции. Но если у вас более выраженное выражение, это может окупиться.