Создание пустого списка в Python - PullRequest
208 голосов
/ 04 июня 2010

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

l = [] 

или

l = list()

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

  1. Технические причины, по которым быстрее. (создание класса приводит к накладным расходам?)
  2. Удобочитаемость кода - какое стандартное соглашение.

Ответы [ 4 ]

288 голосов
/ 04 июня 2010

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

% 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(), потому что это можно произносить .

120 голосов
/ 04 июня 2010

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

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

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

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

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

15 голосов
/ 04 июня 2010

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

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

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

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

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

t = t.append(2)

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

t = list() # explicit instantiation

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

...