Jaki jest najlepszy sposób na utworzenie nowej pustej listy w Pythonie?
l = []
lub
l = list()
Proszę o to z dwóch powodów:
- Przyczyny techniczne, które są szybsze. (utworzenie klasy powoduje narzut?)
- Czytelność kodu - która jest standardową konwencją.
python
performance
list
coding-style
timeit
użytkownik225312
źródło
źródło
Odpowiedzi:
Oto, w jaki sposób możesz przetestować, który fragment kodu jest szybszy:
Jednak w praktyce ta inicjalizacja jest najprawdopodobniej bardzo małą częścią twojego programu, więc martwienie się tym jest prawdopodobnie błędne.
Czytelność jest bardzo subiektywna. Wolę
[]
, ale niektórzy bardzo dobrze znani ludzie, jak Alex Martelli, wolą,list()
ponieważ można to wymówić .źródło
list('')
daje[]
zamiast['']
?list('abcd')
i zrozumiesz wszystko)list()
jest z natury wolniejszy niż[]
, ponieważistnieje wyszukiwanie symboli (nie ma możliwości, aby python wiedział z góry, jeśli nie zdefiniowałeś na nowo listy, aby była czymś innym!),
istnieje wywołanie funkcji,
następnie musi sprawdzić, czy został przekazany iterowalny argument (aby mógł utworzyć listę z jego elementami) ps. w naszym przypadku nie ma żadnego, ale istnieje opcja „jeśli”
W większości przypadków różnica prędkości nie robi jednak żadnej praktycznej różnicy.
źródło
list()
jest wolniejszy niż[]
!list()
musi tylko sprawdzić, czy w ogóle jest jakiś argument ... „sprawdź, czy iterowalny” i „utwórz listę z elementami” po prostu się nie zdarza; mają zastosowanie tylko wtedy, gdy występuje argument. Możliwe jest nawet, że kod C[]
wywołuje ten sam kod C colist()
. W każdym razie czas związany z (c) byłby niewielki w porównaniu z (a) + (b).Używam
[]
.źródło
Tak naprawdę nie wiem o tym, ale z doświadczenia wydaje mi się, że jpcgt ma rację. Poniższy przykład: jeśli użyję następującego kodu
w tłumaczu wywoływanie t daje mi po prostu „t” bez żadnej listy, a jeśli dołączę coś innego, np
Pojawia się błąd „Obiekt NoneType” nie ma atrybutu „append”. Jeśli jednak tworzę listę przez
to działa dobrze.
źródło
t.append(1)
modyfikujet
w miejscu, to nie zwraca niczego, aleNone
i jesteś przypisywanie tegoNone
celut
. Więct
teraz odnosi się doNone
zamiast do listy. Twoim błędem było pisaniet=t.append(1)
zamiast po prostut.append(1)
. Zauważysz to samo zachowanielist()
, więc nie ma tutaj różnicy.Wystarczy podkreślić odpowiedź @Darkonaut, ponieważ uważam, że powinna być bardziej widoczna.
new_list = []
lubnew_list = list()
oba są w porządku (ignorowanie wydajności), aleappend()
zwracaNone
, w wyniku czego nie możesz tego zrobićnew_list = new_list.append(something
.Jestem bardzo zaskoczony taką decyzją typu powrotu. Fuj
źródło