Различия между "d.clear ()" и "d = {}" - PullRequest
4 голосов
/ 28 апреля 2010

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

import timeit

def timing():
    d = dict()

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

Ответы [ 2 ]

19 голосов
/ 28 апреля 2010

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

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

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

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

>>> d = {'foo': 'bar'}
>>> d2 = d
>>> d.clear()
>>> d2
{}
6 голосов
/ 29 апреля 2010

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...