$ python2.7 -m timeit 'd={}'
10000000 loops, best of 3: 0.0331 usec per loop
$ python2.7 -m timeit 'd=dict()'
1000000 loops, best of 3: 0.19 usec per loop
Зачем использовать один над другим?Различия между "d = dict()" и "d = {}"
$ python2.7 -m timeit 'd={}'
10000000 loops, best of 3: 0.0331 usec per loop
$ python2.7 -m timeit 'd=dict()'
1000000 loops, best of 3: 0.19 usec per loop
Зачем использовать один над другим?Различия между "d = dict()" и "d = {}"
Если люди используют (только) dict()
над (только) {}
, это вообще, потому что они не знают о {}
(что вполне подвиг), или потому, что они думают, что это понятнее (который носит субъективный характер, но редко.)
есть вещи, которые вы можете сделать с dict
, что вы не можете сделать с {}
, хотя, например, передать его на что-то, что ожидает калла как, например, collections.defaultdict(dict)
. Там также тот факт, что вы можете вызвать dict
с именованными аргументами, которые некоторые люди предпочитают:
>>> dict(spam=1, ham=2)
{'ham': 2, 'spam': 1}
Лично я предпочитаю синтаксис литерала Dict, потому что он работает лучше, когда вы хотите использовать ключи, которые не являются допустимыми идентификаторами:
>>> dict(pass=1)
File "<stdin>", line 1
dict(pass=1)
^
SyntaxError: invalid syntax
>>> dict('ham and eggs'=1)
File "<stdin>", line 1
SyntaxError: keyword can't be an expression
(и смешение стилей только потому, что некоторые клавиши не являются допустимыми идентификаторами, гадости.)
Я один из тех, кто предпочитает слова пунктуации - это одна из причин, почему я выбрал Python над Perl, например. «Жизнь лучше без брекетов» (старый девиз Python, который по-прежнему шел на футболке с мультфильмом улыбающегося подростка ;-) (изначально предназначался для обозначения скобок и отступов для группировки, конечно, но, эй , скобки - скобки! -).
«Оплачивать» несколько наносекунд (с целью использования четкого, легко читаемого короткого слова вместо брекетов, скобок и других элементов), как правило, является доступным (это в основном стоимость поиска в пространстве имен «встроенные», цена, которую вы платить каждый раз, когда вы используете встроенный тип или функцию, и вы можете мягко оптимизировать его обратно, подняв некоторые поиски из циклов).
Итак, я вообще тот, кто любит писать dict()
для {}
, list(L)
вместо L[:]
, а также list()
для []
, tuple()
для ()
, и так далее - просто общее предпочтение стиль произносимых код. Когда я работаю над существующей базой кода, которая использует другой стиль, или когда у моих товарищей по команде в новом проекте есть сильные предпочтения, я могу согласиться с этим, конечно (не без попытки немного евангелизации в случае товарищей по команде, хотя ;-).
«поднимая некоторые поиски из циклов» - что это значит? – Tshepang
@Tshepang, т.е. вместо 'for i в x: f (dict())' (что делает 'len (x)' lookups для name 'dict'), сначала связывает локальный' d = dict' вне цикла, а затем 'for i in x: f (d()) ', который выполняет быстрый поиск _local для имени' d').Это фундаментальный метод Python для оптимизации некоторых циклов, когда они доказаны (путем профилирования, конечно), чтобы быть узкими местами производительности. –
Кстати (конечно, не связанный с этим вопросом), Unladen Swallow должен сделать ненужным такую идиому (d = dict) :) – rbp
Как сказал Томас, я использую dict(), поэтому могу указать ключевые слова. Особенно, если я вручную создаю большой словарь для инициализации данных или еще чего-то: возможность использования синтаксиса ключевых слов сохраняет мне два нажатия клавиш (и связанный визуальный беспорядок) для каждого элемента.
Doug Hellmann написал исчерпывающий номер comparison.
Нет, 'dict' находится в' __builtin__'. –
@MikeGraham да, но в большинстве случаев '__builtins__' является псевдонимом для' __builtin__' – jamylak