Який найкращий спосіб створити новий порожній список у Python?
l = []
або
l = list()
Я запитую це з двох причин:
- Технічні причини, що швидше. (створення класу викликає накладні витрати?)
- Читання коду - яка з них є стандартною умовою.
Який найкращий спосіб створити новий порожній список у Python?
l = []
або
l = list()
Я запитую це з двох причин:
Відповіді:
Ось як можна перевірити, який фрагмент коду швидше:
% 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()за краще, оскільки це вимовляємо .
list('')дає []замість ['']?
list('abcd')і ви все зрозумієте)
list()за своєю суттю повільніше [], тому що
є пошук символів (жоден спосіб пітон не знає заздалегідь, якщо ви не просто переосмислили список, щоб бути чимось іншим!),
є виклик функції,
тоді він повинен перевірити, чи був переданий ітерабельний аргумент (щоб він міг створити список з елементами з нього) ps. у нашому випадку немає, але перевірка є "якщо"
У більшості випадків різниця швидкостей не матиме жодної практичної різниці.
list()це повільніше, ніж []!
list()цим потрібно лише перевірити, чи був взагалі якийсь аргумент ... "перевірити, чи можна ітерабельно" та "створити список з елементами" просто не трапляється; вони застосовуються лише за наявності аргументу. Можливо навіть, що код C для []виклику того ж самого коду С, що і list(). У будь-якому випадку час, пов'язаний з (с), був би крихітним порівняно з (a) + (b).
Я використовую [].
Я насправді про це не знаю, але мені, як показує досвід, jpcgt насправді прав. Наступний приклад: Якщо я використовую наступний код
t = [] # implicit instantiation
t = t.append(1)
в інтерпретаторі виклик t дає мені просто "t" без будь-якого списку, і якщо я додаю щось інше, наприклад
t = t.append(2)
Я отримую помилку "" NoneType "об'єкт не має атрибута" append "". Якщо я створив цей список за
t = list() # explicit instantiation
тоді це добре працює.
t.append(1)модифікує tна місці, він нічого не повернути , але Noneі ви призначаєте це Noneна t. Тож tтепер посилається на Noneзамість цього списку. Ваша помилка тут полягала в тому, щоб писати t=t.append(1)замість просто t.append(1). Ви помітите таку саму поведінку list(), і тут немає різниці.
Просто, щоб виділити відповідь @Darkonaut, тому що я думаю, що це повинно бути більш помітним.
new_list = []або new_list = list()вони обоє добре (ігноруючи продуктивність), але append()повертаються None, в результаті чого ви не можете цього зробити new_list = new_list.append(something.
Я дуже спантеличений таким рішенням типу повернення. Гидота.