2015-11-17 7 views
1

Как OrderedDict в Python помнит весь порядок элементов? Какова производительность накладных расходов? Для таких проблем, как реализация LRU, я нашел это очень мощным и очень простым в реализации, но какова производительность? Как он помнит порядок ключей, которые были сначала вставлены?Как записывается элемент Python OrderedDict?

Использует ли они Dict() и Double Linked List для запоминания ключей, как показано на рисунке ниже? Я буду очень признателен, если вы сможете передать свое сообщение на простом языке, а не поделиться какой-то исследовательской статьей.

enter image description here

ответ

3

Лучше всего о том, что вы можете посмотреть на источник для OrderedDict, чтобы получить хорошее представление о нем.

Это фактически реализовано в чистом питоне! Это означает, что вы можете скопировать его, переопределить и, как правило, причудливо мутировать его столько, сколько хотите, пока не поймете это.

Он использует двусвязный список, это указано в docstring исходного файла. Получение сцепление how doublylinked lists work и при просмотре источника, вы получите хороший повесить, как именно это работает:

# An inherited dict maps keys to values. 
# The inherited dict provides __getitem__, __len__, __contains__, and get. 
# The remaining methods are order-aware. 
# Big-O running times for all methods are the same as regular dictionaries. 

# The internal self.__map dict maps keys to links in a doubly linked list. 
# The circular doubly linked list starts and ends with a sentinel element. 
# The sentinel element never gets deleted (this simplifies the algorithm). 
# Each link is stored as a list of length three: [PREV, NEXT, KEY]. 
+0

Спасибо, это, безусловно, очень полезно. – python

+0

Не могли бы вы рассказать о последних трех строках, в которых говорится о «контрольном элементе». – python

+0

Sentinels - это, по сути, фиктивные узлы, используемые для обозначения начального и конца связанных списков для целей оптимизации. Есть много ресурсов для них [[1] (https://en.wikipedia.org/wiki/Sentinel_node), [2] (https://en.wikipedia.org/wiki/Linked_list#Using_sentinel_nodes), [3 ] (http://stackoverflow.com/questions/5384358/how-does-a-sentinel-node-offer-benefits-over-null)], и это скорее теоретический аспект. Последнее просто указывает, каково должно быть содержимое каждого узла. –