Используя описанный здесь мини-язык спецификации формата:
https://docs.python.org/2/library/string.html
Искать: 7.1.3.1. Спецификация формата Mini-Language
>>> def f():
... return {'a' : 1, 'b' : 2}
...
>>> def g():
... return dict(a=1, b=2)
...
>>> g()
{'a': 1, 'b': 2}
>>> f()
{'a': 1, 'b': 2}
>>> import dis
>>> dis.dis(f)
2 0 BUILD_MAP 0
3 DUP_TOP
4 LOAD_CONST 1 ('a')
7 LOAD_CONST 2 (1)
10 ROT_THREE
11 STORE_SUBSCR
12 DUP_TOP
13 LOAD_CONST 3 ('b')
16 LOAD_CONST 4 (2)
19 ROT_THREE
20 STORE_SUBSCR
21 RETURN_VALUE
>>> dis.dis(g)
2 0 LOAD_GLOBAL 0 (dict)
3 LOAD_CONST 1 ('a')
6 LOAD_CONST 2 (1)
9 LOAD_CONST 3 ('b')
12 LOAD_CONST 4 (2)
15 CALL_FUNCTION 512
18 RETURN_VALUE
dict () является, по-видимому, некоторыми C встроенный. Действительно умный или преданный человек (не меня) мог посмотреть на источник интерпретатора и сказать Вам больше. Я просто хотел представить dis.dis.:)
В основном, {} синтаксис и обрабатывается на уровне байт-кода и языке. dict () является просто другим встроенным с более гибким синтаксисом инициализации. Обратите внимание, что dict () был только добавлен посреди 2.x ряд.
Насколько производительность идет:
>>> from timeit import timeit
>>> timeit("a = {'a': 1, 'b': 2}")
0.424...
>>> timeit("a = dict(a = 1, b = 2)")
0.889...
Обновление : спасибо за ответы. Удаленное предположение о копии на записи.
Еще одно различие между {}
и dict
- то, что dict
всегда выделяет новый словарь (даже если содержание статично), тогда как {}
не делает всегда , делают так (см. ответ mgood для когда и почему):
def dict1():
return {'a':'b'}
def dict2():
return dict(a='b')
print id(dict1()), id(dict1())
print id(dict2()), id(dict2())
производит:
$ ./mumble.py 11642752 11642752 11867168 11867456
я не предлагаю, чтобы Вы попытались использовать в своих интересах это или нет, это зависит от конкретной ситуации, просто указав на это. (Также, вероятно, очевидно из дизассемблирование , если Вы понимаете коды операций).
@Jacob: существует различие в том, как объекты выделяются, но они не копия на записи. 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, с {}
синтаксис это, кажется, предварительно измеряет хеш-таблицу на основе количества объектов, которые это хранит, который известен во время синтаксического анализа.