Вопрос: различия между «d.clear ()» и «d = {}»


На моей машине скорость выполнения между d.clear() а также d={} более 100 нс, поэтому любопытно, почему нужно использовать один над другим.

import timeit

def timing():
    d = dict()

if __name__=='__main__':
    t = timeit.Timer('timing()', 'from __main__ import timing')
    print t.repeat()

4


источник


Ответы:


d={} создает новый словарь.

d.clear() очищает словарь.

Если вы используете d={}, то все, что указывает на d будет указывать на старый d, Это может привести к ошибке.

Если вы используете d.clear(), то все, что указывает на d теперь укажет на очищенный словарь, это также может привести к ошибке, если это не то, что вы намеревались.

Кроме того, я не думаю d.clear() (в CPython) освободит память, занятую d, Для производительности CPython не  удалите память из словарей, когда вы удаляете элементы, поскольку обычное использование словарей создает большой словарь и может быть  вырезая несколько элементов. Переназначение памяти (и обеспечение того, чтобы хеш-таблица оставалась последовательной) займет слишком много времени в большинстве случаев использования. Вместо этого он заполняет словарь turds (это технический термин в списке рассылки), которые указывают, что элемент был там, но с момента его удаления. Я не совсем уверен, d.clear() делает это, хотя, конечно, удаляет все ключи один за другим.


6



Разница в том, что d = {} создает новый словарь и d.clear() просто опустошает словарь, который у вас уже есть. Это тонкое различие имеет значение, если у вас есть другие места в вашем коде, содержащие ссылки на ваш словарь. В первом случае эти другие объекты не будут видеть никаких изменений, потому что вы не изменили оригинальный словарь. Следующий код показывает эту разницу в действии.

Создание нового словаря:

>>> d = {'foo': 'bar'}
>>> d2 = d
>>> d = {}
>>> d2
{'foo': 'bar'}

Очистка существующего словаря:

>>> d = {'foo': 'bar'}
>>> d2 = d
>>> d.clear()
>>> d2
{}

19