Сначала я подумал, что dict.clear
просто выполнил некоторое уменьшение ссылок, чтобы сборщик мусора выполнил грязную работу без O (1), но, глядя на исходный код (спасибо Timgeb за предоставленную ссылкуКажется, это не так:
oldvalues = mp->ma_values;
if (oldvalues == empty_values)
return;
/* Empty the dict... */
dictkeys_incref(Py_EMPTY_KEYS);
mp->ma_keys = Py_EMPTY_KEYS;
mp->ma_values = empty_values;
mp->ma_used = 0;
mp->ma_version_tag = DICT_NEXT_VERSION();
/* ...then clear the keys and values */
if (oldvalues != NULL) {
n = oldkeys->dk_nentries;
for (i = 0; i < n; i++)
Py_CLEAR(oldvalues[i]);
Я вижу, что если в словаре есть значения, то выполняется цикл, чтобы уменьшить ссылки на эти значения и установить указатели на NULL
.Похоже, что O(n)
не O(1)
, поскольку это зависит от количества значений.
Когда вы присваиваете новый дикт, такой как d = {}
, это O(1)
, но сборщик мусорадолжен удалить старый объект, если на него больше нет ссылок.Это может быть неправильно при назначении, но это произойдет, если Python не завершится внезапно.