На моей машине скорость выполнения между d.clear()
а также d={}
более 100 нс, поэтому любопытно, почему нужно использовать один над другим.
import timeit
def timing():
d = dict()
if __name__=='__main__':
t = timeit.Timer('timing()', 'from __main__ import timing')
print t.repeat()
d={}
создает новый словарь.
d.clear()
очищает словарь.
Если вы используете d={}
, то все, что указывает на d
будет указывать на старый d
, Это может привести к ошибке.
Если вы используете d.clear()
, то все, что указывает на d
теперь укажет на очищенный словарь, это также может привести к ошибке, если это не то, что вы намеревались.
Кроме того, я не думаю d.clear()
(в CPython) освободит память, занятую d
, Для производительности CPython не удалите память из словарей, когда вы удаляете элементы, поскольку обычное использование словарей создает большой словарь и может быть вырезая несколько элементов. Переназначение памяти (и обеспечение того, чтобы хеш-таблица оставалась последовательной) займет слишком много времени в большинстве случаев использования. Вместо этого он заполняет словарь turds
(это технический термин в списке рассылки), которые указывают, что элемент был там, но с момента его удаления. Я не совсем уверен, d.clear()
делает это, хотя, конечно, удаляет все ключи один за другим.
Разница в том, что d = {}
создает новый словарь и d.clear()
просто опустошает словарь, который у вас уже есть. Это тонкое различие имеет значение, если у вас есть другие места в вашем коде, содержащие ссылки на ваш словарь. В первом случае эти другие объекты не будут видеть никаких изменений, потому что вы не изменили оригинальный словарь. Следующий код показывает эту разницу в действии.
Создание нового словаря:
>>> d = {'foo': 'bar'}
>>> d2 = d
>>> d = {}
>>> d2
{'foo': 'bar'}
Очистка существующего словаря:
>>> d = {'foo': 'bar'}
>>> d2 = d
>>> d.clear()
>>> d2
{}