Який найкращий спосіб створити новий порожній список у 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
.
Я дуже спантеличений таким рішенням типу повернення. Гидота.