Создание пустого списка в Python

243

Каков наилучший способ создать новый пустой список в Python?

l = [] 

или

l = list()

Я спрашиваю об этом по двум причинам:

  1. Технические причины, по которым быстрее. (создание класса вызывает накладные расходы?)
  2. Читаемость кода - какой является стандартным соглашением.
user225312
источник
4
"Быстрее"? Почему ты не пробежал время?
С.Лотт

Ответы:

335

Вот как вы можете проверить, какой фрагмент кода быстрее:

% python -mtimeit  "l=[]"
10000000 loops, best of 3: 0.0711 usec per loop

% python -mtimeit  "l=list()"
1000000 loops, best of 3: 0.297 usec per loop

Однако на практике эта инициализация, скорее всего, является чрезвычайно малой частью вашей программы, поэтому беспокоиться об этом, вероятно, неправильно.

Читаемость очень субъективна. Я предпочитаю [], но некоторые очень знающие люди, такие как Алекс Мартелли, предпочитают, list()потому что это произносится .

unutbu
источник
12
Вау, спасибо за профилирование. Я всегда хотел знать, как это было сделано.
user225312
Почему list('')дают []вместо ['']?
Chris_Rands
Это потому, что этот func делает список из повторяемых типов, вы не можете вставить более одного аргумента. (Попробуй набери list('abcd')и все поймешь)
Иван Лавренов
133

list()медленнее, чем [], потому что

  1. есть поиск по символам (у python нет возможности узнать заранее, если вы не просто переопределите список как нечто другое!),

  2. есть вызов функции,

  3. затем он должен проверить, был ли передан итеративный аргумент (чтобы он мог создать список с элементами из него) ps. нет в нашем случае, но есть проверка "если"

В большинстве случаев разница в скорости не будет иметь практического значения.

Нас Банов
источник
38
+1: приятно понимать почему list()медленнее чем []!
Эрик О Лебиго
2
В случае этого list()нужно только проверить, был ли вообще какой-либо аргумент ... «проверить, повторяем ли» и «создать список с элементами» просто не бывает; они применяются только при наличии аргумента. Возможно даже, что C-код для []вызовов тот же C-код, что и list(). В любом случае время (c) будет крошечным по сравнению с (a) + (b).
Джон Мачин
1
@ Джон Мачин - извините за путаницу, в (с) я имел в виду, что нужно будет проверить, есть ли аргумент, да. остальное было о том, что произойдет, если будут аргументы, которых в нашем случае нет
Nas Banov
16

Я использую [].

  1. Это быстрее, потому что запись списка является коротким замыканием.
  2. Создание списка с элементами должно выглядеть примерно так же, как и создание списка, почему должна быть разница?
Георг Шолли
источник
3

Я действительно не знаю об этом, но по опыту мне кажется, что jpcgt на самом деле прав. Следующий пример: если я использую следующий код

t = [] # implicit instantiation
t = t.append(1)

в интерпретаторе, затем вызов t дает мне просто «t» без какого-либо списка, и если я добавляю что-то еще, например

t = t.append(2)

Я получаю сообщение об ошибке «Объект NoneType не имеет атрибута« добавить »». Если, однако, я создаю список

t = list() # explicit instantiation

тогда работает нормально.

Yinyue
источник
15
Это потому , что t.append(1)модифицирует tна месте, он ничего не вернуть , но Noneи вы назначаете это Noneна t. Так tотносится теперь к Noneсписку, а не к списку. Ваша ошибка здесь заключалась в том, чтобы писать t=t.append(1)вместо просто t.append(1). Вы заметите такое же поведение list(), поэтому здесь нет никакой разницы.
Darkonaut
1

Просто чтобы выделить ответ @Darkonaut, потому что я думаю, что он должен быть более заметным.

new_list = []или new_list = list()оба в порядке (игнорируя производительность), но append()возвращаются None, в результате чего вы не можете сделать new_list = new_list.append(something.

Я очень озадачен таким решением типа возврата. Тьфу.

ово
источник