Новое и улучшенное, а не O (n 2 ) : Но все же медленнее, чем два других ответа.
Единственное преимущество этого решения - памятьэкономия.Это избегает создания большого диктата и вместо этого хранит только то, что необходимо в то время.Второе решение TokenMacGuy делает то же самое, но это немного быстрее.
def get_deltas_aas(today, yesterday):
deltas = {}
for (new_rank, new_album), (old_rank, old_album) in \
itertools.izip(enumerate(today), enumerate(yesterday)):
if old_album in deltas:
#Believe it or not, this is faster than deltas.pop(old_album) + old_rank
yield (old_album, deltas[old_album] + old_rank)
del deltas[old_album]
else:
deltas[old_album] = old_rank
if new_album in deltas:
yield (new_album, deltas[new_album] - new_rank)
del deltas[new_album]
else:
deltas[new_album] = -new_rank
Вот некоторые временные результаты для большинства ответов здесь (все в Python, если я что-то не пропустил).dict
порядок действует.Если кто-то хочет, чтобы я как-то изменил их код, просто пингуйте меня.
get_deltas_token1: 1.08131885529 msecs
get_deltas_gnibbler: 1.06443881989 msecs
get_deltas_tyler: 1.61993408203 msecs
get_deltas_token2: 1.52525019646 msecs
get_deltas_hughdbrown: 3.27240777016 msecs
get_deltas_aas: 1.39379096031 msecs
Код, который я использовал для определения времени: здесь .Я доволен временной структурой, которую я подбросил вместе для этого.Должно быть полезно в будущем после рефакторинга кода для запуска тестов.