Я сейчас читаю Как думать как компьютерный ученый и прорабатываю там упражнения.В разделе «Алгоритм списка» есть функция (remove_adjacent_dups), которую, я думал, можно улучшить.
Исходная функция:
def remove_adjacent_dups(xs):
""" Return a new list in which all adjacent
duplicates from xs have been removed.
"""
result = []
most_recent_elem = None
for e in xs:
if e != most_recent_elem:
result.append(e)
most_recent_elem = e
return result
Моя функция:
def remove_duplicates(xs):
"""Removes duplicate elements from given list ”xs” """
result = []
for e in xs:
if e not in xs:
result.append(e)
return result
remove_adjacent_dups будет работать только с отсортированным списком, поэтому требуется дополнительная операция. remove_duplicates Не важно, отсортирована последовательность или нет, она все равно удалит все дубликаты.Дело в том, что, если я применю свою функцию к упражнению в книге, оно будет значительно медленнее:
remove_duplicates:
Там27336 слов в книге.Уникальны только 2569.
Это заняло 0,2556 секунды.
remove_adjacent_dups:
В книге 27336 слов.Только 2569 уникальны.
Это заняло 0,0132 секунды.(операция сортировки включена в это время)
Любой может понять, почему remove_adjacent_dups более эффективен, даже если он включает в себя дополнительную операцию сортировки и имеет еще одну дополнительную переменную most_recent_elem