Каково различие между dict () и {}?

Используя описанный здесь мини-язык спецификации формата:

https://docs.python.org/2/library/string.html

Искать: 7.1.3.1. Спецификация формата Mini-Language

62
задан verix 19 March 2009 в 21:19
поделиться

5 ответов

>>> 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.:)

72
ответ дан Steven Huwig 7 November 2019 в 13:01
поделиться

В основном, {} синтаксис и обрабатывается на уровне байт-кода и языке. dict () является просто другим встроенным с более гибким синтаксисом инициализации. Обратите внимание, что dict () был только добавлен посреди 2.x ряд.

8
ответ дан Benjamin Peterson 7 November 2019 в 13:01
поделиться

Насколько производительность идет:

>>> from timeit import timeit
>>> timeit("a = {'a': 1, 'b': 2}")
0.424...
>>> timeit("a = dict(a = 1, b = 2)")
0.889...
37
ответ дан DNS 7 November 2019 в 13:01
поделиться

Обновление : спасибо за ответы. Удаленное предположение о копии на записи.

Еще одно различие между {} и 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

я не предлагаю, чтобы Вы попытались использовать в своих интересах это или нет, это зависит от конкретной ситуации, просто указав на это. (Также, вероятно, очевидно из дизассемблирование , если Вы понимаете коды операций).

6
ответ дан Community 7 November 2019 в 13:01
поделиться

@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, с {} синтаксис это, кажется, предварительно измеряет хеш-таблицу на основе количества объектов, которые это хранит, который известен во время синтаксического анализа.

26
ответ дан Matt Good 24 November 2019 в 16:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: