В видео Преобразование кода в красивый идиоматический Python (ссылка начинается в 10:07), докладчик говорит, что использование key
вместо функции сравнения cmp
для сортировки более эффективно.Перефразируя: он утверждает, что из-за сравнения O (nlog (n)) функция сравнения будет вызываться 20 раз для списка элементов 1м (log2 (1m) ~ 20), тогда как использование key
лучше, потому что оно вызываетсяровно один раз за ключ.
Я понимаю его мысль о том, что использование key
более читабельно, но я не понимаю, как он определил, что он вызывается один раз для каждого ключа.Я бы подумал, что под капотом функция сортировки, имеющая параметр key
, будет выглядеть примерно так:
def sort(sequence, key=None):
if key is None:
key = lambda x: x
def compare(first, second):
if key(first) < key(second): return -1
if key(second) < key(first): return 1
return 0
# ... implement sorting algorithm
И, таким образом, будет одинаковая сложность по времени, если мы будем использовать ключевую функциюили функция сравнения.
Как функция ключа вызывается только один раз для каждого элемента, если есть O (nlog (n)) сравнений?Это Timsort подробности реализации?
Редактировать:
Чтобы ответить на комментарий с просьбой привести пример:
В python2, функция sorted
принимает аргумент cmp
, что-то вроде этого:
def compare(first, second):
if len(first) < len(second): return -1
if len(second) < len(first): return 1
return 0
sorted(my_list, cmp=compare)
Однако вы также можете передать ключевую функцию, если хотите.Итак, для достижения того же эффекта, что и выше, вы должны сделать следующее:
sorted(my_list, key=len)
В видео автор утверждает, что второй вариант более эффективен, чем первый.