@ Джейкоб: Есть разница в том, как объекты распределяются, но они не копируются при записи. Python выделяет «свободный список» фиксированного размера, где он может быстро размещать объекты словаря (до тех пор, пока он не заполнится). Словари, выделенные с помощью синтаксиса {}
(или вызова C на PyDict_New
), могут быть получены из этого свободного списка. Когда на словарь больше не ссылаются, он возвращается в свободный список, и этот блок памяти можно использовать повторно (хотя поля сбрасываются первыми).
Этот первый словарь немедленно возвращается в свободный список, а следующий снова использует пространство памяти:
>>> id({})
340160
>>> id({1: 2})
340160
Если вы сохраните ссылку, следующий словарь появится в следующем свободном слоте:
>>> x = {}
>>> id(x)
340160
>>> id({})
340016
Но мы можем удалить ссылку на этот словарь и снова освободить его слот:
>>> del x
>>> id({})
340160
Поскольку синтаксис {}
обрабатывается в байт-коде, он может использовать эту оптимизацию, упомянутую выше. С другой стороны, dict()
обрабатывается как обычный конструктор классов, а Python использует универсальный распределитель памяти, который не следует легко предсказуемому шаблону, как свободный список выше.
Также, глядя на compile.c из Python 2.6, с синтаксисом {}
кажется, что он предварительно изменяет размер хеш-таблицы на основе количества элементов, которые он хранит, что известно во время разбора.