list.append()
jest oczywistym wyborem do dodania na końcu listy. Oto rozsądne wyjaśnienie zaginięcia list.prepend()
. Zakładając, że moja lista jest krótka, a problemy z wydajnością są znikome
list.insert(0, x)
lub
list[0:0] = [x]
idiomatyczny?
Jeśli możesz przejść funkcjonalnie, poniższe informacje są dość jasne
Oczywiście, że nie dodaje
x
sięyour_list
, a po utworzeniu nowej listy zx
preprended do niego.źródło
Zwykle nie chcesz powtarzalnie dodawać do listy w Pythonie.
Jeśli jest krótki i nie robisz tego dużo ... to dobrze.
list.insert
list.insert
Mogą być wykorzystane w ten sposób.Jest to jednak nieefektywne, ponieważ w Pythonie a
list
to tablica wskaźników, a Python musi teraz pobrać każdy wskaźnik z listy i przesunąć go o jeden w dół, aby wstawić wskaźnik do obiektu w pierwszym gnieździe, więc jest to naprawdę skuteczne dla raczej krótkich list, jak pytasz.Oto fragment kodu źródłowego CPython, w którym jest on zaimplementowany - i jak widać, zaczynamy od końca tablicy i przesuwamy wszystko o jeden w dół dla każdego wstawienia:
Jeśli potrzebujesz kontenera / listy, która jest wydajna w dodawaniu elementów, potrzebujesz listy połączonej. Python ma podwójnie połączoną listę, którą można szybko wstawiać na początku i na końcu - nazywa się to
deque
.deque.appendleft
collections.deque
Ma wiele sposobów na liście.list.sort
jest wyjątkiem, którydeque
definitywnie nie zastępuje Liskovalist
.Ma
deque
równieżappendleft
metodę (jak równieżpopleft
).deque
Jest dwukrotnie zakończył kolejka i podwójnie związany list - bez względu na długość, to zawsze ma taką samą ilość czasu, aby preprend coś. W dużej notacji O, O (1) a czas O (n) dla list. Oto użycie:deque.extendleft
Istotna jest również
extendleft
metoda deque , która iteracyjnie przygotowuje:Pamiętaj, że każdy element będzie dodawany jeden po drugim, co skutecznie odwróci ich kolejność.
Wydajność
list
kontradeque
Najpierw konfigurujemy iteracyjne poprzedzanie:
i wydajność:
Deque jest znacznie szybszy. Gdy listy będą coraz dłuższe, oczekiwałbym, że deque będzie działał jeszcze lepiej. Jeśli możesz użyć deque's
extendleft
, prawdopodobnie uzyskasz w ten sposób najlepszą wydajność.źródło
Jeśli ktoś znajdzie to pytanie tak jak ja, oto moje testy wydajności proponowanych metod:
Jak widać,
insert
przypisywanie plasterków jest prawie dwa razy szybsze niż jawne dodawanie i są bardzo zbliżone w wynikach. Jak zauważył Raymond Hettinger ,insert
jest bardziej powszechną opcją i ja osobiście wolę ten sposób, aby przejść do listy.źródło
.insert
i[0:0] = [0]
działają w miejscu , wciąż muszą ponownie przydzielić cały bufor.