Створення порожнього списку в Python


243

Який найкращий спосіб створити новий порожній список у Python?

l = [] 

або

l = list()

Я запитую це з двох причин:

  1. Технічні причини, що швидше. (створення класу викликає накладні витрати?)
  2. Читання коду - яка з них є стандартною умовою.

4
"швидше"? Чому ти не запустив timeit?
S.Lott

Відповіді:


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()за краще, оскільки це вимовляємо .


12
Вау, спасибі за профілювання. Я завжди хотів знати, як це робиться.
user225312

Чому list('')дає []замість ['']?
Chris_Rands

Це тому, що цей функціонал складає список з ітерабельних типів, ви не можете вставити більше 1 аргументу. (Спробуйте набрати, list('abcd')і ви все зрозумієте)
Іван Лавренов

133

list()за своєю суттю повільніше [], тому що

  1. є пошук символів (жоден спосіб пітон не знає заздалегідь, якщо ви не просто переосмислили список, щоб бути чимось іншим!),

  2. є виклик функції,

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

У більшості випадків різниця швидкостей не матиме жодної практичної різниці.


38
+1: Це добре розуміти, чому list()це повільніше, ніж []!
Ерік О Лебігот

2
У випадку з list()цим потрібно лише перевірити, чи був взагалі якийсь аргумент ... "перевірити, чи можна ітерабельно" та "створити список з елементами" просто не трапляється; вони застосовуються лише за наявності аргументу. Можливо навіть, що код C для []виклику того ж самого коду С, що і list(). У будь-якому випадку час, пов'язаний з (с), був би крихітним порівняно з (a) + (b).
Джон Махін

1
@John Machin - вибачте за плутанину, що я мав на увазі в (с), що потрібно буде перевірити, чи є аргумент, так. інше було про те, що буде, якщо будуть аргументи, яких у нашому випадку немає
Нас Банов

16

Я використовую [].

  1. Це швидше, оскільки позначення списку - це коротке замикання.
  2. Створення списку з елементами має виглядати приблизно так само, як і без створення списку, чому має бути різниця?

3

Я насправді про це не знаю, але мені, як показує досвід, jpcgt насправді прав. Наступний приклад: Якщо я використовую наступний код

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

в інтерпретаторі виклик t дає мені просто "t" без будь-якого списку, і якщо я додаю щось інше, наприклад

t = t.append(2)

Я отримую помилку "" NoneType "об'єкт не має атрибута" append "". Якщо я створив цей список за

t = list() # explicit instantiation

тоді це добре працює.


15
Це тому , що t.append(1)модифікує tна місці, він нічого не повернути , але Noneі ви призначаєте це Noneна t. Тож tтепер посилається на Noneзамість цього списку. Ваша помилка тут полягала в тому, щоб писати t=t.append(1)замість просто t.append(1). Ви помітите таку саму поведінку list(), і тут немає різниці.
Дарконаут

1

Просто, щоб виділити відповідь @Darkonaut, тому що я думаю, що це повинно бути більш помітним.

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

Я дуже спантеличений таким рішенням типу повернення. Гидота.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.