[] и {} против list () и dict (), что лучше? - PullRequest
90 голосов
/ 26 апреля 2011

Я понимаю, что оба они, по сути, одно и то же, но с точки зрения стиля, какой из них лучше (более Pythonic) использовать для создания пустого списка или dict?

Ответы [ 8 ]

173 голосов
/ 26 апреля 2011

С точки зрения скорости, нет конкуренции за пустые списки / дикты:

>>> from timeit import timeit
>>> timeit("[]")
0.040084982867934334
>>> timeit("list()")
0.17704233359267718
>>> timeit("{}")
0.033620194745424214
>>> timeit("dict()")
0.1821558326547077

и для непустых:

>>> timeit("[1,2,3]")
0.24316302770330367
>>> timeit("list((1,2,3))")
0.44744206316727286
>>> timeit("list(foo)", setup="foo=(1,2,3)")
0.446036018543964
>>> timeit("{'a':1, 'b':2, 'c':3}")
0.20868602015059423
>>> timeit("dict(a=1, b=2, c=3)")
0.47635635255323905
>>> timeit("dict(bar)", setup="bar=[('a', 1), ('b', 2), ('c', 3)]")
0.9028228448029267

Кроме того, используя скобочные обозначения, вы можете использовать список и словарь, что может быть достаточной причиной.

31 голосов
/ 26 апреля 2011

На мой взгляд, [] и {} являются наиболее питонными и читаемыми способами создания пустых списков / диктов.

Остерегайтесь set(), хотя, например:

this_set = {5}
some_other_set = {}

Может сбивать с толку.Первый создает набор с одним элементом, второй создает пустой dict и не набор.

14 голосов
/ 26 апреля 2011

Литерал dict может быть крошечный бит быстрее, поскольку его байт-код короче:

In [1]: import dis
In [2]: a = lambda: {}
In [3]: b = lambda: dict()

In [4]: dis.dis(a)
  1           0 BUILD_MAP                0
              3 RETURN_VALUE

In [5]: dis.dis(b)
  1           0 LOAD_GLOBAL              0 (dict)
              3 CALL_FUNCTION            0
              6 RETURN_VALUE

То же самое относится к list против []

3 голосов
/ 26 апреля 2011

ИМХО, использование list() и dict() делает ваш Python похожим на C. Тьфу.

1 голос
/ 26 марта 2018

В случае различий между [] и list () есть ловушка, на которую я не видел, чтобы кто-то еще указывал. Если вы используете словарь в качестве члена списка, оба будут давать совершенно разные результаты:

In [1]: foo_dict = {"1":"foo", "2":"bar"}

In [2]: [foo_dict]
Out [2]: [{'1': 'foo', '2': 'bar'}]

In [3]: list(foo_dict)
Out [3]: ['1', '2'] 
0 голосов
/ 22 мая 2018

есть одно различие в поведении между [] и list (), как показано в примере ниже. нам нужно использовать list (), если мы хотим получить список чисел, в противном случае мы получаем объект карты! Не знаю, как это объяснить.

sth = [(1,2), (3,4),(5,6)]
sth2 = map(lambda x: x[1], sth) 
print(sth2) # print returns object <map object at 0x000001AB34C1D9B0>

sth2 = [map(lambda x: x[1], sth)]
print(sth2) # print returns object <map object at 0x000001AB34C1D9B0>
type(sth2) # list 
type(sth2[0]) # map

sth2 = list(map(lambda x: x[1], sth))
print(sth2) #[2, 4, 6]
type(sth2) # list
type(sth2[0]) # int
0 голосов
/ 26 мая 2017

время, похоже, не дает точного времени. Согласно тесту timeit, указанному выше для dict (), кажется, что он занимает ~ 200 мс, что намного медленнее, чем обычные http-вызовы. Попробуйте запустить в shell, dict () и затем timeit ("dict ()"), вы увидите видимую разницу в исполнении; timeit ("dict ()") занимает больше времени. Скопируйте и вставьте следующий фрагмент кода и запустите в оболочке, вы не увидите большой разницы в обоих {} и dict ().

    from datetime import datetime
    then = datetime.now()
    a = dict()
    now = datetime.now()
    print then
    print now

    then = datetime.now()
    b = {}
    now = datetime.now()
    print then
    print now
0 голосов
/ 26 апреля 2011

В основном это вопрос выбора. Это вопрос предпочтений.

Обратите внимание, однако, что если у вас есть цифровые клавиши, например, вы не можете сделать:

mydict = dict(1="foo", 2="bar")

Вы должны сделать:

mydict = {"1":"foo", "2":"bar"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...